diff --git a/.github/workflows/internal-release.yml b/.github/workflows/internal-release.yml index e8b8ee61..a246a6e3 100644 --- a/.github/workflows/internal-release.yml +++ b/.github/workflows/internal-release.yml @@ -1,4 +1,4 @@ -name: Publish package to the JFROG Artifactory +name: Publish module to the JFROG Artifactory on: push: tags-ignore: @@ -7,20 +7,37 @@ on: - "*.md" branches: - release/* + - flowvault-release/* jobs: + resolve-module: + runs-on: ubuntu-latest + outputs: + module: ${{ steps.set-module.outputs.module }} + steps: + - name: Resolve module from branch name + id: set-module + run: | + if [[ "${{ github.ref_name }}" == flowvault-release/* ]]; then + echo "module=flowvault" >> "$GITHUB_OUTPUT" + else + echo "module=v2" >> "$GITHUB_OUTPUT" + fi + build-and-deploy: + needs: resolve-module uses: ./.github/workflows/shared-build-and-deploy.yml with: ref: ${{ github.ref_name }} server-id: central profile: jfrog tag: 'internal' + module: ${{ needs.resolve-module.outputs.module }} secrets: server-username: ${{ secrets.ARTIFACTORY_USERNAME }} server-password: ${{ secrets.ARTIFACTORY_PASSWORD }} gpg-key: ${{ secrets.JFROG_GPG_KEY }} gpg-passphrase: ${{ secrets.JFROG_GPG_PASSPHRASE }} - skyflow-credentials: ${{ secrets.SKYFLOW_CREDENTIALS }} >> .env - test-expired-token: ${{ secrets.TEST_EXPIRED_TOKEN }} >> .env - test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} >> .env + skyflow-credentials: ${{ secrets.SKYFLOW_CREDENTIALS }} + test-expired-token: ${{ secrets.TEST_EXPIRED_TOKEN }} + test-reusable-token: ${{ secrets.TEST_REUSABLE_TOKEN }} diff --git a/.github/workflows/shared-build-and-deploy.yml b/.github/workflows/shared-build-and-deploy.yml index 29fa4b2d..894b6ec2 100644 --- a/.github/workflows/shared-build-and-deploy.yml +++ b/.github/workflows/shared-build-and-deploy.yml @@ -21,6 +21,13 @@ on: description: 'Release Tag' required: true type: string + + module: + description: 'Module to build and publish' + required: false + type: string + default: '' + secrets: server-username: required: true @@ -61,10 +68,10 @@ jobs: server-password: SERVER_PASSWORD gpg-private-key: ${{ secrets.gpg-key }} # Value of the GPG private key to import gpg-passphrase: GPG_PASSPHRASE # env variable for GPG private key passphrase - + - name: Resolve Branch for the Tagged Commit id: resolve-branch - if: ${{ inputs.tag == 'beta' || inputs.tag == 'public' }} + if: ${{ inputs.tag == 'beta' || inputs.tag == 'public' }} run: | TAG_COMMIT=$(git rev-list -n 1 ${{ github.ref_name }}) BRANCH_NAME=$(git for-each-ref --points-at="$TAG_COMMIT" --format='%(refname:short)' refs/remotes/origin | grep -v '/HEAD$' | sed 's#^origin/##' | head -n 1) @@ -85,9 +92,9 @@ jobs: run: | chmod +x ./scripts/bump_version.sh if ${{ inputs.tag == 'internal' }}; then - ./scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}" "$(git rev-parse --short "$GITHUB_SHA")" + ./scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}" "$(git rev-parse --short "$GITHUB_SHA")" "${{ inputs.module }}" else - ./scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}" + ./scripts/bump_version.sh "${{ steps.previoustag.outputs.tag }}" "" "${{ inputs.module }}" fi - name: Commit changes @@ -99,7 +106,7 @@ jobs: git checkout ${{ env.branch_name }} fi - git add pom.xml + git add ${{ inputs.module }}/pom.xml if [[ "${{ inputs.tag }}" == "internal" ]]; then git commit -m "[AUTOMATED] Private Release ${{ steps.previoustag.outputs.tag }}-dev-$(git rev-parse --short $GITHUB_SHA)" git push origin ${{ github.ref_name }} -f @@ -125,9 +132,14 @@ jobs: json: ${{ secrets.TEST_CREDENTIALS_FILE_STRING }} - name: Publish package - run: mvn --batch-mode deploy -P ${{ inputs.profile }} + run: | + if [[ "${{ inputs.tag }}" == "internal" ]]; then + mvn --batch-mode -pl ${{ inputs.module }} -am deploy -P jfrog -DskipTests + elif [[ "${{ inputs.tag }}" == "beta" || "${{ inputs.tag }}" == "public" ]]; then + mvn --batch-mode -pl ${{ inputs.module }} -am deploy -P ${{ inputs.profile }} + fi env: SERVER_USERNAME: ${{ secrets.server-username }} SERVER_PASSWORD: ${{ secrets.server-password }} - GPG_PASSPHRASE: ${{ secrets.gpg-passphrase }} + GPG_PASSPHRASE: ${{ secrets.gpg-passphrase }} \ No newline at end of file diff --git a/common/pom.xml b/common/pom.xml new file mode 100644 index 00000000..72fff275 --- /dev/null +++ b/common/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + com.skyflow + skyflow + 1.0.0 + ../pom.xml + + + common + 1.0.0 + ${project.groupId}:${project.artifactId} + + + + true + 8 + 8 + UTF-8 + + \ No newline at end of file diff --git a/common/src/main/java/com/skyflow/BaseSkyflow.java b/common/src/main/java/com/skyflow/BaseSkyflow.java new file mode 100644 index 00000000..a60dc02b --- /dev/null +++ b/common/src/main/java/com/skyflow/BaseSkyflow.java @@ -0,0 +1,211 @@ +package com.skyflow; + +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.config.Credentials; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.utils.validations.BaseValidations; + +import java.util.LinkedHashMap; +import java.util.Map; + + +abstract class BaseSkyflow, V extends BaseVaultConfig> implements ISkyflow { + protected final BaseSkyflowClientBuilder builder; + + protected BaseSkyflow(BaseSkyflowClientBuilder builder) { + this.builder = builder; + LogUtil.printInfoLog(InfoLogs.CLIENT_INITIALIZED.getLog()); + } + + protected abstract Self self(); + + @Override + public Self addVaultConfig(V vaultConfig) throws SkyflowException { + this.builder.addVaultConfigTemplate(vaultConfig); + return self(); + } + + public V getVaultConfig(String vaultId) { + return this.builder.vaultConfigMap.get(vaultId); + } + + @Override + public Self updateVaultConfig(V vaultConfig) throws SkyflowException { + this.builder.updateVaultConfigTemplate(vaultConfig); + return self(); + } + + @Override + public Self removeVaultConfig(String vaultId) throws SkyflowException { + this.builder.removeVaultConfigTemplate(vaultId); + return self(); + } + + @Override + public Self updateSkyflowCredentials(Credentials credentials) throws SkyflowException { + this.builder.addSkyflowCredentialsTemplate(credentials); + return self(); + } + + @Override + public Self setLogLevel(LogLevel logLevel) { + this.builder.setLogLevel(logLevel); + return self(); + } + + @Override + public LogLevel getLogLevel() { + return this.builder.logLevel; + } + + protected static T resolveOrThrow(Map map, String key, + ErrorLogs errorLog, ErrorMessage errorMessage) throws SkyflowException { + T value = key != null ? map.get(key) : map.values().stream().findFirst().orElse(null); + if (value == null) { + LogUtil.printErrorLog(errorLog.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), errorMessage.getMessage()); + } + return value; + } + + abstract static class BaseSkyflowClientBuilder { + protected final LinkedHashMap vaultConfigMap = new LinkedHashMap<>(); + protected Credentials skyflowCredentials; + protected LogLevel logLevel = LogLevel.ERROR; + + protected BaseSkyflowClientBuilder() { + } + + public BaseSkyflowClientBuilder addVaultConfig(V vaultConfig) throws SkyflowException { + addVaultConfigTemplate(vaultConfig); + return this; + } + + public BaseSkyflowClientBuilder updateVaultConfig(V vaultConfig) throws SkyflowException { + updateVaultConfigTemplate(vaultConfig); + return this; + } + + public BaseSkyflowClientBuilder removeVaultConfig(String vaultId) throws SkyflowException { + removeVaultConfigTemplate(vaultId); + return this; + } + + public BaseSkyflowClientBuilder addSkyflowCredentials(Credentials credentials) throws SkyflowException { + addSkyflowCredentialsTemplate(credentials); + return this; + } + + protected BaseSkyflowClientBuilder setLogLevel(LogLevel logLevel) { + this.logLevel = logLevel == null ? LogLevel.ERROR : logLevel; + LogUtil.setupLogger(this.logLevel); + LogUtil.printInfoLog(BaseUtils.parameterizedString( + InfoLogs.CURRENT_LOG_LEVEL.getLog(), String.valueOf(this.logLevel) + )); + return this; + } + + protected final void addVaultConfigTemplate(V vaultConfig) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog()); + validateVaultConfig(vaultConfig); + V vaultConfigCopy = cloneVaultConfig(vaultConfig); + String vaultId = extractVaultId(vaultConfigCopy); + if (hasVaultClient(vaultId)) { + LogUtil.printErrorLog(BaseUtils.parameterizedString( + ErrorLogs.VAULT_CONFIG_EXISTS.getLog(), vaultId + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + ErrorMessage.VaultIdAlreadyInConfigList.getMessage()); + } + onVaultConfigAdded(vaultConfigCopy); + this.vaultConfigMap.put(vaultId, vaultConfigCopy); + } + + protected final void updateVaultConfigTemplate(V vaultConfig) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog()); + validateVaultConfig(vaultConfig); + String vaultId = extractVaultId(vaultConfig); + if (!hasVaultClient(vaultId)) { + LogUtil.printErrorLog(BaseUtils.parameterizedString( + ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); + } + V previousConfig = this.vaultConfigMap.get(vaultId); + V merged = mergeVaultConfig(vaultConfig, cloneVaultConfig(previousConfig)); + onVaultConfigUpdated(merged); + this.vaultConfigMap.put(vaultId, merged); + } + + protected final void removeVaultConfigTemplate(String vaultId) throws SkyflowException { + if (!hasVaultClient(vaultId)) { + LogUtil.printErrorLog(BaseUtils.parameterizedString(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId)); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); + } + onVaultConfigRemoved(vaultId); + this.vaultConfigMap.remove(vaultId); + } + + protected final void addSkyflowCredentialsTemplate(Credentials credentials) throws SkyflowException { + BaseValidations.validateCredentials(credentials); + Credentials credentialsCopy; + try { + credentialsCopy = (Credentials) credentials.clone(); + } catch (CloneNotSupportedException e) { + throw new SkyflowException(e.getMessage(), e); + } + onCredentialsUpdated(credentialsCopy); + this.skyflowCredentials = credentialsCopy; + } + + protected abstract void validateVaultConfig(V vaultConfig) throws SkyflowException; + + protected abstract boolean hasVaultClient(String vaultId); + + @SuppressWarnings("unchecked") + protected final V cloneVaultConfig(V vaultConfig) throws SkyflowException { + try { + return (V) vaultConfig.clone(); + } catch (CloneNotSupportedException e) { + throw new SkyflowException(e.getMessage(), e); + } + } + + protected final String extractVaultId(V vaultConfig) { + return vaultConfig.getVaultId(); + } + + protected final V mergeVaultConfig(V incoming, V existing) throws SkyflowException { + if (incoming.getEnv() != null) { + existing.setEnv(incoming.getEnv()); + } + if (incoming.getClusterId() != null) { + existing.setClusterId(incoming.getClusterId()); + } + if (incoming.getCredentials() != null) { + try { + existing.setCredentials((Credentials) incoming.getCredentials().clone()); + } catch (CloneNotSupportedException e) { + throw new SkyflowException(e.getMessage(), e); + } + } + return existing; + } + + protected abstract void onVaultConfigAdded(V vaultConfig) throws SkyflowException; + + protected abstract void onVaultConfigUpdated(V updatedConfig) throws SkyflowException; + + protected abstract void onVaultConfigRemoved(String vaultId) throws SkyflowException; + + protected abstract void onCredentialsUpdated(Credentials credentials) throws SkyflowException; + } + +} diff --git a/common/src/main/java/com/skyflow/BaseVaultClient.java b/common/src/main/java/com/skyflow/BaseVaultClient.java new file mode 100644 index 00000000..3d5b0d32 --- /dev/null +++ b/common/src/main/java/com/skyflow/BaseVaultClient.java @@ -0,0 +1,114 @@ +package com.skyflow; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.skyflow.config.BaseCredentials; +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.serviceaccount.util.Token; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.utils.validations.BaseValidations; +import io.github.cdimascio.dotenv.Dotenv; +import io.github.cdimascio.dotenv.DotenvException; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import okhttp3.Request; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +class BaseVaultClient { + protected V vaultConfig; + protected OkHttpClient sharedHttpClient; + protected String currentVaultURL; + protected BaseCredentials commonCredentials; + protected BaseCredentials finalCredentials; + protected String token; + protected String apiKey; + + protected BaseVaultClient(V vaultConfig, BaseCredentials credentials) { + this.vaultConfig = vaultConfig; + this.commonCredentials = credentials; + } + + protected V getVaultConfig() { + return vaultConfig; + } + + protected OkHttpClient buildSharedHttpClient(Supplier tokenSupplier) { + return new OkHttpClient.Builder() + .connectionPool(new ConnectionPool(10, 1, TimeUnit.MINUTES)) + .addInterceptor(chain -> { + Request requestWithAuth = chain.request().newBuilder() + .header("Authorization", "Bearer " + tokenSupplier.get()) + .build(); + return chain.proceed(requestWithAuth); + }) + .build(); + } + + protected synchronized void prioritiseCredentials(BaseCredentials vaultSpecificCredentials) throws SkyflowException { + try { + BaseCredentials original = this.finalCredentials; + if (vaultSpecificCredentials != null) { + this.finalCredentials = vaultSpecificCredentials; + } else if (this.commonCredentials != null) { + this.finalCredentials = this.commonCredentials; + } else { + String sysCredentials = System.getenv(BaseConstants.ENV_CREDENTIALS_KEY_NAME); + if (sysCredentials == null) { + Dotenv dotenv = Dotenv.load(); + sysCredentials = dotenv.get(BaseConstants.ENV_CREDENTIALS_KEY_NAME); + } + if (sysCredentials == null) { + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentials.getMessage()); + } else { + this.finalCredentials = new BaseCredentials(); + this.finalCredentials.setCredentialsString(sysCredentials); + } + } + if (original != null && !original.equals(this.finalCredentials)) { + token = null; + apiKey = null; + } + } catch (DotenvException e) { + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentials.getMessage()); + } catch (SkyflowException e) { + throw e; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + protected synchronized void setBearerToken(BaseCredentials vaultSpecificCredentials) throws SkyflowException { + prioritiseCredentials(vaultSpecificCredentials); + BaseValidations.validateCredentials(this.finalCredentials); + if (this.finalCredentials.getApiKey() != null) { + LogUtil.printInfoLog(InfoLogs.USE_API_KEY.getLog()); + token = this.finalCredentials.getApiKey(); + } else if (token == null || token.trim().isEmpty()) { + token = BaseUtils.generateBearerToken(this.finalCredentials); + } else if (Token.isExpired(token)) { + LogUtil.printInfoLog(InfoLogs.BEARER_TOKEN_EXPIRED.getLog()); + token = BaseUtils.generateBearerToken(this.finalCredentials); + } else { + LogUtil.printInfoLog(InfoLogs.REUSE_BEARER_TOKEN.getLog()); + } + } + + protected static SkyflowException wrapApiException(int statusCode, Throwable cause, + Map> headers, + Object responseBody, ErrorLogs errorLog) { + LogUtil.printErrorLog(errorLog.getLog()); + Gson gson = new GsonBuilder().serializeNulls().create(); + return new SkyflowException(statusCode, cause, headers, gson.toJson(responseBody)); + } +} diff --git a/common/src/main/java/com/skyflow/ISkyflow.java b/common/src/main/java/com/skyflow/ISkyflow.java new file mode 100644 index 00000000..1c29b780 --- /dev/null +++ b/common/src/main/java/com/skyflow/ISkyflow.java @@ -0,0 +1,20 @@ +package com.skyflow; + +import com.skyflow.config.BaseCredentials; +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; + +public interface ISkyflow, V extends BaseVaultConfig, C extends BaseCredentials> { + Self addVaultConfig(V vaultConfig) throws SkyflowException; + + Self updateVaultConfig(V vaultConfig) throws SkyflowException; + + Self removeVaultConfig(String vaultId) throws SkyflowException; + + Self updateSkyflowCredentials(C credentials) throws SkyflowException; + + Self setLogLevel(LogLevel logLevel); + + LogLevel getLogLevel(); +} diff --git a/src/main/java/com/skyflow/config/Credentials.java b/common/src/main/java/com/skyflow/config/BaseCredentials.java similarity index 71% rename from src/main/java/com/skyflow/config/Credentials.java rename to common/src/main/java/com/skyflow/config/BaseCredentials.java index c2594ef6..48ab70dc 100644 --- a/src/main/java/com/skyflow/config/Credentials.java +++ b/common/src/main/java/com/skyflow/config/BaseCredentials.java @@ -1,20 +1,21 @@ package com.skyflow.config; import java.util.ArrayList; +import java.util.HashMap; import java.util.Map; -public class Credentials { +public class BaseCredentials implements Cloneable { private String path; private ArrayList roles; - private Object context; private String credentialsString; private String token; private String apiKey; + private Object context; - public Credentials() { + public BaseCredentials() { this.path = null; - this.context = null; this.credentialsString = null; + this.context = null; } public String getPath() { @@ -33,18 +34,6 @@ public void setRoles(ArrayList roles) { this.roles = roles; } - public Object getContext() { - return context; - } - - public void setContext(String context) { - this.context = context; - } - - public void setContext(Map context) { - this.context = context; - } - public String getCredentialsString() { return credentialsString; } @@ -68,4 +57,28 @@ public String getApiKey() { public void setApiKey(String apiKey) { this.apiKey = apiKey; } + public Object getContext() { + return context; + } + + public void setContext(String context) { + this.context = context; + } + + public void setContext(Map context) { + this.context = context; + } + + @Override + @SuppressWarnings("unchecked") + public Object clone() throws CloneNotSupportedException { + BaseCredentials copy = (BaseCredentials) super.clone(); + if (this.roles != null) { + copy.roles = new ArrayList<>(this.roles); + } + if (this.context instanceof Map) { + copy.context = new HashMap<>((Map) this.context); + } + return copy; + } } diff --git a/src/main/java/com/skyflow/config/VaultConfig.java b/common/src/main/java/com/skyflow/config/BaseVaultConfig.java similarity index 71% rename from src/main/java/com/skyflow/config/VaultConfig.java rename to common/src/main/java/com/skyflow/config/BaseVaultConfig.java index 4f61af2a..fb1a2a6b 100644 --- a/src/main/java/com/skyflow/config/VaultConfig.java +++ b/common/src/main/java/com/skyflow/config/BaseVaultConfig.java @@ -2,13 +2,13 @@ import com.skyflow.enums.Env; -public class VaultConfig { +public class BaseVaultConfig implements Cloneable { private String vaultId; private String clusterId; private Env env; private Credentials credentials; - public VaultConfig() { + public BaseVaultConfig() { this.vaultId = null; this.clusterId = null; this.env = Env.PROD; @@ -46,4 +46,14 @@ public Credentials getCredentials() { public void setCredentials(Credentials credentials) { this.credentials = credentials; } + + @Override + public Object clone() throws CloneNotSupportedException { + BaseVaultConfig cloned = (BaseVaultConfig) super.clone(); + if (this.credentials != null) { + cloned.credentials = (Credentials) this.credentials.clone(); + } + return cloned; + } + } diff --git a/common/src/main/java/com/skyflow/config/Credentials.java b/common/src/main/java/com/skyflow/config/Credentials.java new file mode 100644 index 00000000..b0d6b888 --- /dev/null +++ b/common/src/main/java/com/skyflow/config/Credentials.java @@ -0,0 +1,7 @@ +package com.skyflow.config; + +public class Credentials extends BaseCredentials { + public Credentials() { + super(); + } +} diff --git a/common/src/main/java/com/skyflow/enums/CustomHeaderKey.java b/common/src/main/java/com/skyflow/enums/CustomHeaderKey.java new file mode 100644 index 00000000..03649eee --- /dev/null +++ b/common/src/main/java/com/skyflow/enums/CustomHeaderKey.java @@ -0,0 +1,18 @@ +package com.skyflow.enums; + +public enum CustomHeaderKey { + SkyflowAccountID("x-skyflow-account-id"), + SkyflowAccountName("x-skyflow-account-name"), + RequestIDHeader("x-request-id"); + + private final String value; + + CustomHeaderKey(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value; + } +} diff --git a/src/main/java/com/skyflow/enums/Env.java b/common/src/main/java/com/skyflow/enums/Env.java similarity index 100% rename from src/main/java/com/skyflow/enums/Env.java rename to common/src/main/java/com/skyflow/enums/Env.java diff --git a/src/main/java/com/skyflow/enums/LogLevel.java b/common/src/main/java/com/skyflow/enums/LogLevel.java similarity index 100% rename from src/main/java/com/skyflow/enums/LogLevel.java rename to common/src/main/java/com/skyflow/enums/LogLevel.java diff --git a/src/main/java/com/skyflow/errors/ErrorCode.java b/common/src/main/java/com/skyflow/errors/ErrorCode.java similarity index 100% rename from src/main/java/com/skyflow/errors/ErrorCode.java rename to common/src/main/java/com/skyflow/errors/ErrorCode.java diff --git a/common/src/main/java/com/skyflow/errors/ErrorMessage.java b/common/src/main/java/com/skyflow/errors/ErrorMessage.java new file mode 100644 index 00000000..1e4d9178 --- /dev/null +++ b/common/src/main/java/com/skyflow/errors/ErrorMessage.java @@ -0,0 +1,211 @@ +package com.skyflow.errors; + +import com.skyflow.utils.SdkVersion; + +public enum ErrorMessage { + // Client initialization + VaultIdAlreadyInConfigList("%s0 Validation error. VaultId is present in an existing config. Specify a new vaultId in config."), + VaultIdNotInConfigList("%s0 Validation error. VaultId is missing from the config. Specify the vaultIds from configs."), + OnlySingleVaultConfigAllowed("%s0 Validation error. A vault config already exists. Cannot add another vault config."), + ConnectionIdAlreadyInConfigList("%s0 Validation error. ConnectionId is present in an existing config. Specify a connectionId in config."), + ConnectionIdNotInConfigList("%s0 Validation error. ConnectionId is missing from the config. Specify the connectionIds from configs."), + EmptyCredentials("%s0 Validation error. Invalid credentials. Credentials must not be empty."), + TableSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name cannot be specified at both the request and record levels. Please specify the table name in only one place."), + UpsertTableRequestAtRecordLevel("%s0 Validation error. Table name should be present at each record level when upsert is present at record level."), + UpsertTableRequestAtRequestLevel("%s0 Validation error. Upsert should be present at each record level when table name is present at record level."), + TableNotSpecifiedInRequestAndRecordObject("%s0 Validation error. Table name is missing. Table name should be specified at one place either at the request level or record level. Please specify the table name at one place."), + // Vault config + InvalidVaultId("%s0 Initialization failed. Invalid vault ID. Specify a valid vault ID."), + EmptyVaultId("%s0 Initialization failed. Invalid vault ID. Vault ID must not be empty."), + InvalidClusterId("%s0 Initialization failed. Invalid cluster ID. Specify cluster ID."), + EmptyClusterId("%s0 Initialization failed. Invalid cluster ID. Specify a valid cluster ID."), + EmptyVaultUrl("%s0 Initialization failed. Vault URL is empty. Specify a valid vault URL."), + InvalidVaultUrlFormat("%s0 Initialization failed. Vault URL must start with 'https://'."), + EitherVaultUrlOrClusterIdRequired("%s0 Initialization failed. Specify either 'clusterId' or 'vaultURL'."), + + // Connection config + InvalidConnectionId("%s0 Initialization failed. Invalid connection ID. Specify a valid connection ID."), + EmptyConnectionId("%s0 Initialization failed. Invalid connection ID. Connection ID must not be empty."), + InvalidConnectionUrl("%s0 Initialization failed. Invalid connection URL. Specify a valid connection URL."), + EmptyConnectionUrl("%s0 Initialization failed. Invalid connection URL. Connection URL must not be empty."), + InvalidConnectionUrlFormat("%s0 Initialization failed. Connection URL is not a valid URL. Specify a valid connection URL."), + + // Credentials + MultipleTokenGenerationMeansPassed("%s0 Initialization failed. Invalid credentials. Specify only one from 'path', 'credentialsString', 'token' or 'apiKey'."), + NoTokenGenerationMeansPassed("%s0 Initialization failed. Invalid credentials. Specify any one from 'path', 'credentialsString', 'token' or 'apiKey'."), + EmptyCredentialFilePath("%s0 Initialization failed. Invalid credentials. Credentials file path must not be empty."), + EmptyCredentialsString("%s0 Initialization failed. Invalid credentials. Credentials string must not be empty."), + EmptyToken("%s0 Initialization failed. Invalid credentials. Token must not be empty."), + EmptyApikey("%s0 Initialization failed. Invalid credentials. Api key must not be empty."), + InvalidApikey("%s0 Initialization failed. Invalid credentials. Specify valid api key."), + EmptyRoles("%s0 Initialization failed. Invalid roles. Specify at least one role."), + EmptyRoleInRoles("%s0 Initialization failed. Invalid role. Specify a valid role."), + EmptyContext("%s0 Initialization failed. Invalid context. Specify a valid context."), + InvalidContextType("%s0 Initialization failed. Invalid context type. Specify context as a String or Map."), + InvalidContextMapKey("%s0 Initialization failed. Invalid key '%s1' in context map. Keys must contain only alphanumeric characters and underscores."), + + // Bearer token generation + FileNotFound("%s0 Initialization failed. Credential file not found at %s1. Verify the file path."), + FileInvalidJson("%s0 Initialization failed. File at %s1 is not in valid JSON format. Verify the file contents."), + CredentialsStringInvalidJson("%s0 Initialization failed. Credentials string is not in valid JSON format. Verify the credentials string contents."), + InvalidCredentials("%s0 Initialization failed. Invalid credentials provided. Specify valid credentials."), + MissingPrivateKey("%s0 Initialization failed. Unable to read private key in credentials. Verify your private key."), + MissingClientId("%s0 Initialization failed. Unable to read client ID in credentials. Verify your client ID."), + MissingKeyId("%s0 Initialization failed. Unable to read key ID in credentials. Verify your key ID."), + MissingTokenUri("%s0 Initialization failed. Unable to read token URI in credentials. Verify your token URI."), + InvalidTokenUri("%s0 Initialization failed. Token URI in not a valid URL in credentials. Verify your token URI."), + JwtInvalidFormat("%s0 Initialization failed. Invalid private key format. Verify your credentials."), + InvalidAlgorithm("%s0 Initialization failed. Invalid algorithm to parse private key. Specify valid algorithm."), + InvalidKeySpec("%s0 Initialization failed. Unable to parse RSA private key. Verify your credentials."), + JwtDecodeError("%s0 Validation error. Invalid access token. Verify your credentials."), + MissingAccessToken("%s0 Validation error. Access token not present in the response from bearer token generation. Verify your credentials."), + MissingTokenType("%s0 Validation error. Token type not present in the response from bearer token generation. Verify your credentials."), + BearerTokenExpired("%s0 Validation error. Bearer token is invalid or expired. Please provide a valid bearer token."), + + // Insert + InsertRequestNull("%s0 Validation error. InsertRequest object is null. Specify a valid InsertRequest object."), + TableKeyError("%s0 Validation error. 'table' key is missing from the payload. Specify a 'table' key."), + EmptyTable("%s0 Validation error. 'table' can't be empty. Specify a table."), + ValuesKeyError("%s0 Validation error. 'values' key is missing from the payload. Specify a 'values' key."), + EmptyRecords("%s0 Validation error. 'records' can't be empty. Specify records."), + EmptyKeyInRecords("%s0 Validation error. Invalid key in data in records. Specify a valid key."), + EmptyValueInRecords("%s0 Validation error. Invalid value in records. Specify a valid value."), + RecordsKeyError("%s0 Validation error. 'records' key is missing from the payload. Specify a 'records' key."), + EmptyValues("%s0 Validation error. 'values' can't be empty. Specify values."), + EmptyKeyInValues("%s0 Validation error. Invalid key in values. Specify a valid key."), + EmptyValueInValues("%s0 Validation error. Invalid value in values. Specify a valid value."), + TokensKeyError("%s0 Validation error. 'tokens' key is missing from the payload. Specify a 'tokens' key."), + EmptyTokens("%s0 Validation error. The 'tokens' field is empty. Specify tokens for one or more fields."), + EmptyKeyInTokens("%s0 Validation error. Invalid key tokens. Specify a valid key."), + EmptyValueInTokens("%s0 Validation error. Invalid value in tokens. Specify a valid value."), + EmptyUpsert("%s0 Validation error. 'upsert' key can't be empty. Specify an upsert column."), + EmptyUpsertValues("%s0 Validation error. Upsert column values can't be empty. Specify at least one upsert column."), + HomogenousNotSupportedWithUpsert("%s0 Validation error. 'homogenous' is not supported with 'upsert'. Specify either 'homogenous' or 'upsert'."), + TokensPassedForTokenModeDisable("%s0 Validation error. 'tokenMode' wasn't specified. Set 'tokenMode' to 'ENABLE' to insert tokens."), + NoTokensWithTokenMode("%s0 Validation error. Tokens weren't specified for records while 'tokenMode' was %s1. Specify tokens."), + MismatchOfFieldsAndTokens("%s0 Validation error. 'fields' and 'tokens' have different columns names. Verify that 'fields' and 'tokens' columns match."), + InsufficientTokensPassedForTokenModeEnableStrict("%s0 Validation error. 'tokenMode' is set to 'ENABLE_STRICT', but some fields are missing tokens. Specify tokens for all fields."), + BatchInsertPartialSuccess("%s0 Insert operation completed with partial success."), + BatchInsertFailure("%s0 Insert operation failed."), + RecordSizeExceedError("%s0 Maximum number of records exceeded. The limit is 10000."), + + // Detokenize + InvalidDetokenizeData("%s0 Validation error. Invalid detokenize data. Specify valid detokenize data."), + EmptyDetokenizeData("%s0 Validation error. Invalid data tokens. Specify at least one data token."), + EmptyTokenInDetokenizeData("%s0 Validation error. Invalid data tokens. Specify a valid data token."), + TokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 10000."), + + // Delete Tokens + DeleteTokensRequestNull("%s0 Validation error. DeleteTokensRequest object is null. Specify a valid DeleteTokensRequest object."), + EmptyDeleteTokensData("%s0 Validation error. Tokens list is empty. Specify at least one token to delete."), + EmptyTokenInDeleteTokensData("%s0 Validation error. Invalid token in delete tokens request. Specify a valid token."), + DeleteTokensSizeExceedError("%s0 Maximum number of tokens exceeded. The limit is 10000."), + + // Get + IdsKeyError("%s0 Validation error. 'ids' key is missing from the payload. Specify an 'ids' key."), + EmptyIds("%s0 Validation error. 'ids' can't be empty. Specify at least one id."), + EmptyIdInIds("%s0 Validation error. Invalid id in 'ids'. Specify a valid id."), + EmptyFields("%s0 Validation error. Fields are empty in get payload. Specify at least one field."), + EmptyFieldInFields("%s0 Validation error. Invalid field in 'fields'. Specify a valid field."), + RedactionKeyError("%s0 Validation error. 'redaction' key is missing from the payload. Specify a 'redaction' key."), + RedactionWithTokensNotSupported("%s0 Validation error. 'redaction' can't be used when 'returnTokens' is specified. Remove 'redaction' from payload if 'returnTokens' is specified."), + TokensGetColumnNotSupported("%s0 Validation error. Column name and/or column values can't be used when 'returnTokens' is specified. Remove unique column values or 'returnTokens' from the payload."), + EmptyOffset("%s0 Validation error. 'offset' can't be empty. Specify an offset."), + EmptyLimit("%s0 Validation error. 'limit' can't be empty. Specify a limit."), + UniqueColumnOrIdsKeyError("%s0 Validation error. 'ids' or 'columnName' key is missing from the payload. Specify the ids or unique 'columnName' in payload."), + BothIdsAndColumnDetailsSpecified("%s0 Validation error. Both Skyflow IDs and column details can't be specified. Either specify Skyflow IDs or unique column details."), + ColumnNameKeyError("%s0 Validation error. 'columnName' isn't specified whereas 'columnValues' are specified. Either add 'columnName' or remove 'columnValues'."), + EmptyColumnName("%s0 Validation error. 'columnName' can't be empty. Specify a column name."), + ColumnValuesKeyErrorGet("%s0 Validation error. 'columnValues' aren't specified whereas 'columnName' is specified. Either add 'columnValues' or remove 'columnName'."), + EmptyColumnValues("%s0 Validation error. 'columnValues' can't be empty. Specify at least one column value"), + EmptyValueInColumnValues("%s0 Validation error. Invalid value in column values. Specify a valid column value."), + + TokenKeyError("%s0 Validation error. 'token' key is missing from the payload. Specify a 'token' key."), + PartialSuccess("%s0 Validation error. Check 'SkyflowError.data' for details."), + + // Update + DataKeyError("%s0 Validation error. 'data' key is missing from the payload. Specify a 'data' key."), + EmptyData("%s0 Validation error. 'data' can't be empty. Specify data."), + SkyflowIdKeyError("%s0 Validation error. 'skyflow_id' is missing from the data payload. Specify a 'skyflow_id'."), + InvalidSkyflowIdType("%s0 Validation error. Invalid type for 'skyflow_id' in data payload. Specify 'skyflow_id' as a string."), + EmptySkyflowId("%s0 Validation error. 'skyflow_id' can't be empty. Specify a skyflow id."), + + // Query + QueryKeyError("%s0 Validation error. 'query' key is missing from the payload. Specify a 'query' key."), + EmptyQuery("%s0 Validation error. 'query' can't be empty. Specify a query"), + + // Tokenize + ColumnValuesKeyErrorTokenize("%s0 Validation error. 'columnValues' key is missing from the payload. Specify a 'columnValues' key."), + EmptyColumnGroupInColumnValue("%s0 Validation error. Invalid column group in column value. Specify a valid column group."), + TokenizeRequestNull("%s0 Validation error. TokenizeRequest object is null. Specify a valid TokenizeRequest object."), + EmptyTokenizeData("%s0 Validation error. Tokenize data is empty. Specify at least one tokenize record."), + TokenizeRecordNull("%s0 Validation error. TokenizeRecord in the list is null. Specify a valid TokenizeRecord object."), + EmptyValueInTokenizeRecord("%s0 Validation error. Value in TokenizeRecord is null or empty. Specify a valid value."), + EmptyTokenGroupNamesInTokenizeRecord("%s0 Validation error. TokenGroupNames in TokenizeRecord is null or empty. Specify at least one token group name."), + EmptyTokenGroupNameInTokenizeRecord("%s0 Validation error. Token group name in TokenizeRecord is null or empty. Specify a valid token group name."), + TokenizeDataSizeExceedError("%s0 Maximum number of tokenize records exceeded. The limit is 10000."), + + // Connection + InvalidRequestHeaders("%s0 Validation error. Request headers aren't valid. Specify valid request headers."), + EmptyRequestHeaders("%s0 Validation error. Request headers are empty. Specify valid request headers."), + InvalidPathParams("%s0 Validation error. Path parameters aren't valid. Specify valid path parameters."), + EmptyPathParams("%s0 Validation error. Path parameters are empty. Specify valid path parameters."), + InvalidQueryParams("%s0 Validation error. Query parameters aren't valid. Specify valid query parameters."), + EmptyQueryParams("%s0 Validation error. Query parameters are empty. Specify valid query parameters."), + InvalidRequestBody("%s0 Validation error. Invalid request body. Specify the request body as an object."), + EmptyRequestBody("%s0 Validation error. Request body can't be empty. Specify a valid request body."), + + // File upload + ColumnNameKeyErrorFileUpload("%s0 Validation error. columnName is missing from the payload. Specify a columnName key."), + MissingFileSourceInUploadFileRequest("%s0 Validation error. Provide exactly one of filePath, base64, or fileObject."), + FileNameMustBeProvidedWithFileObject("%s0 Validation error. fileName must be provided when using fileObject."), + InvalidFileObject("%s0 Validation error. Invalid file object in file upload request. Specify a valid file object."), + InvalidBase64("%s0 Validation error. Invalid base64 string in file upload request. Specify a valid base64 string."), + + // detect + InvalidTextInDeIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), + InvalidTextInReIdentify("%s0 Validation error. The text field is required and must be a non-empty string. Specify a valid text."), + + //Detect Files + InvalidNullFileInDeIdentifyFile("%s0 Validation error. The file field is required and must not be null. Specify a valid file object."), + InvalidFilePath("%s0 Validation error. The file path is invalid. Specify a valid file path."), + BothFileAndFilePathProvided("%s0 Validation error. Both file and filePath are provided. Specify either file object or filePath, not both."), + FileNotFoundToDeidentify("%s0 Validation error. The file to deidentify was not found at the specified path. Verify the file path and try again."), + FileNotReadableToDeidentify("%s0 Validation error. The file to deidentify is not readable. Check the file permissions and try again."), + InvalidPixelDensityToDeidentifyFile("%s0 Validation error. Should be a positive integer. Specify a valid pixel density."), + InvalidMaxResolution("%s0 Validation error. Should be a positive integer. Specify a valid max resolution."), + OutputDirectoryNotFound("%s0 Validation error. The output directory for deidentified files was not found at the specified path. Verify the output directory path and try again."), + InvalidPermission("%s0 Validation error. The output directory for deidentified files is not writable. Check the directory permissions and try again."), + InvalidWaitTime("%s0 Validation error. The wait time for deidentify file operation should be a positive integer. Specify a valid wait time."), + WaitTimeExceedsLimit("%s0 Validation error. The wait time for deidentify file operation exceeds the maximum limit of 64 seconds. Specify a wait time less than or equal to 60 seconds."), + InvalidOrEmptyRunId("%s0 Validation error. The run ID is invalid or empty. Specify a valid run ID."), + FailedToEncodeFile("%s0 Validation error. Failed to encode the file. Ensure the file is in a supported format and try again."), + FailedToDecodeFileFromResponse("%s0 Failed to decode the file from the response. Ensure the response is valid and try again."), + EmptyFileAndFilePathInDeIdentifyFile("%s0 Validation error. Both file and filePath are empty. Specify either file object or filePath, not both."), + VaultTokenFormatIsNotAllowedForFiles("%s0 Validation error. Vault token format is not allowed for deidentify file request."), + PollingForResultsFailed("%s0 API error. Polling for results failed. Unable to retrieve the deidentified file"), + FailedToSaveProcessedFile("%s0 Validation error. Failed to save the processed file. Ensure the output directory is valid and writable."), + InvalidAudioFileType("%s0 Validation error. The file type is not supported. Specify a valid file type mp3 or wav."), + // Generic + ErrorOccurred("%s0 API error. Error occurred."), + + DetokenizeRequestNull("%s0 Validation error. DetokenizeRequest object is null. Specify a valid DetokenizeRequest object."), + + NullTokenGroupRedactions("%s0 Validation error. TokenGroupRedaction in the list is null. Specify a valid TokenGroupRedactions object."), + + NullRedactionInTokenGroup("%s0 Validation error. Redaction in TokenGroupRedactions is null or empty. Specify a valid redaction."), + + NullTokenGroupNameInTokenGroup("%s0 Validation error. TokenGroupName in TokenGroupRedactions is null or empty. Specify a valid tokenGroupName."), + InvalidRecord("%s0 Validation error. InsertRecord object in the list is invalid. Specify a valid InsertRecord object."), + ; + + private final String message; + + ErrorMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message.replace("%s0", SdkVersion.getSdkPrefix()); + } +} diff --git a/src/main/java/com/skyflow/errors/HttpStatus.java b/common/src/main/java/com/skyflow/errors/HttpStatus.java similarity index 100% rename from src/main/java/com/skyflow/errors/HttpStatus.java rename to common/src/main/java/com/skyflow/errors/HttpStatus.java diff --git a/common/src/main/java/com/skyflow/errors/SkyflowException.java b/common/src/main/java/com/skyflow/errors/SkyflowException.java new file mode 100644 index 00000000..676bdd74 --- /dev/null +++ b/common/src/main/java/com/skyflow/errors/SkyflowException.java @@ -0,0 +1,135 @@ +package com.skyflow.errors; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.skyflow.utils.BaseConstants; + +import java.util.List; +import java.util.Map; + +public class SkyflowException extends Exception { + private String requestId; + private Integer grpcCode; + private Integer httpCode; + private String message; + private String httpStatus; + private JsonArray details; + private JsonObject responseBody; + + public SkyflowException(String message) { + super(message); + this.message = message; + } + + public SkyflowException(Throwable cause) { + super(cause); + this.message = cause.getMessage(); + } + + public SkyflowException(String message, Throwable cause) { + super(message, cause); + this.message = message; + } + + public SkyflowException(int code, String message) { + super(message); + this.httpCode = code; + this.message = message; + this.httpStatus = HttpStatus.BAD_REQUEST.getHttpStatus(); + this.details = new JsonArray(); + } + + public SkyflowException(int httpCode, Throwable cause, Map> responseHeaders, String responseBody) { + super(cause); + this.httpCode = httpCode > 0 ? httpCode : 400; + try { + setRequestId(responseHeaders); + setResponseBody(responseBody, responseHeaders); + } catch (Exception e) { + this.httpStatus = HttpStatus.BAD_REQUEST.getHttpStatus(); + String fullMessage = responseBody != null ? responseBody : + (cause.getLocalizedMessage() != null ? cause.getMessage() : ErrorMessage.ErrorOccurred.getMessage()); + this.message = fullMessage.split("HTTP response code:")[0].trim(); + } + } + + private void setResponseBody(String responseBody, Map> responseHeaders) { + this.responseBody = JsonParser.parseString(responseBody).getAsJsonObject(); + if (this.responseBody.get("error") != null) { + setGrpcCode(); + setHttpStatus(); + setMessage(); + setDetails(responseHeaders); + } + } + + public String getRequestId() { + return requestId; + } + + private void setRequestId(Map> responseHeaders) { + List ids = responseHeaders.get(BaseConstants.REQUEST_ID_HEADER_KEY); + this.requestId = ids == null ? null : ids.get(0); + } + + private void setMessage() { + JsonElement messageElement = ((JsonObject) responseBody.get("error")).get("message"); + this.message = messageElement == null ? null : messageElement.getAsString(); + } + + private void setGrpcCode() { + JsonElement grpcElement = ((JsonObject) responseBody.get("error")).get("grpc_code"); + this.grpcCode = grpcElement == null ? null : grpcElement.getAsInt(); + } + + private void setHttpStatus() { + JsonElement statusElement = ((JsonObject) responseBody.get("error")).get("http_status"); + this.httpStatus = statusElement == null ? null : statusElement.getAsString(); + } + + public int getHttpCode() { + return httpCode == null ? 0 : httpCode; + } + + public JsonArray getDetails() { + return details; + } + + private void setDetails(Map> responseHeaders) { + JsonElement detailsElement = ((JsonObject) responseBody.get("error")).get("details"); + List errorFromClientHeader = responseHeaders.get(BaseConstants.ERROR_FROM_CLIENT_HEADER_KEY); + if (detailsElement != null) { + this.details = detailsElement.getAsJsonArray(); + } + if (errorFromClientHeader != null) { + this.details = this.details == null ? new JsonArray() : this.details; + String errorFromClient = errorFromClientHeader.get(0); + JsonObject detailObject = new JsonObject(); + detailObject.addProperty("errorFromClient", errorFromClient); + this.details.add(detailObject); + } + } + + public Integer getGrpcCode() { + return grpcCode; + } + + public String getHttpStatus() { + return httpStatus; + } + + @Override + public String getMessage() { + return message; + } + + @Override + public String toString() { + return String.format( + "%n requestId: %s%n grpcCode: %s%n httpCode: %s%n httpStatus: %s%n message: %s%n details: %s", + this.requestId, this.grpcCode, this.httpCode, this.httpStatus, this.message, this.details + ); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java new file mode 100644 index 00000000..a1dd3aae --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClient.java @@ -0,0 +1,29 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest; + +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.Suppliers; +import com.skyflow.generated.auth.rest.resources.authentication.AuthenticationClient; + +import java.util.function.Supplier; + +public class ApiClient { + protected final ClientOptions clientOptions; + + protected final Supplier authenticationClient; + + public ApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.authenticationClient = Suppliers.memoize(() -> new AuthenticationClient(clientOptions)); + } + + public AuthenticationClient authentication() { + return this.authenticationClient.get(); + } + + public static ApiClientBuilder builder() { + return new ApiClientBuilder(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java new file mode 100644 index 00000000..aed3ed24 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/ApiClientBuilder.java @@ -0,0 +1,67 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest; + +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.Environment; +import okhttp3.OkHttpClient; + +public final class ApiClientBuilder { + private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); + + private String token = null; + + private Environment environment = Environment.PRODUCTION; + + /** + * Sets token + */ + public ApiClientBuilder token(String token) { + this.token = token; + return this; + } + + public ApiClientBuilder environment(Environment environment) { + this.environment = environment; + return this; + } + + public ApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public ApiClientBuilder timeout(int timeout) { + this.clientOptionsBuilder.timeout(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public ApiClientBuilder maxRetries(int maxRetries) { + this.clientOptionsBuilder.maxRetries(maxRetries); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public ApiClientBuilder httpClient(OkHttpClient httpClient) { + this.clientOptionsBuilder.httpClient(httpClient); + return this; + } + + public ApiClient build() { + if (token == null) { + throw new RuntimeException("Please provide token"); + } + this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); + clientOptionsBuilder.environment(this.environment); + return new ApiClient(clientOptionsBuilder.build()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java new file mode 100644 index 00000000..748eb02e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClient.java @@ -0,0 +1,29 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest; + +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.Suppliers; +import com.skyflow.generated.auth.rest.resources.authentication.AsyncAuthenticationClient; + +import java.util.function.Supplier; + +public class AsyncApiClient { + protected final ClientOptions clientOptions; + + protected final Supplier authenticationClient; + + public AsyncApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.authenticationClient = Suppliers.memoize(() -> new AsyncAuthenticationClient(clientOptions)); + } + + public AsyncAuthenticationClient authentication() { + return this.authenticationClient.get(); + } + + public static AsyncApiClientBuilder builder() { + return new AsyncApiClientBuilder(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java new file mode 100644 index 00000000..2e30d45a --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/AsyncApiClientBuilder.java @@ -0,0 +1,67 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest; + +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.Environment; +import okhttp3.OkHttpClient; + +public final class AsyncApiClientBuilder { + private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); + + private String token = null; + + private Environment environment = Environment.PRODUCTION; + + /** + * Sets token + */ + public AsyncApiClientBuilder token(String token) { + this.token = token; + return this; + } + + public AsyncApiClientBuilder environment(Environment environment) { + this.environment = environment; + return this; + } + + public AsyncApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public AsyncApiClientBuilder timeout(int timeout) { + this.clientOptionsBuilder.timeout(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public AsyncApiClientBuilder maxRetries(int maxRetries) { + this.clientOptionsBuilder.maxRetries(maxRetries); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { + this.clientOptionsBuilder.httpClient(httpClient); + return this; + } + + public AsyncApiClient build() { + if (token == null) { + throw new RuntimeException("Please provide token"); + } + this.clientOptionsBuilder.addHeader("Authorization", "Bearer " + this.token); + clientOptionsBuilder.environment(this.environment); + return new AsyncApiClient(clientOptionsBuilder.build()); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java new file mode 100644 index 00000000..53d67f0b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientApiException.java @@ -0,0 +1,74 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.Response; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This exception type will be thrown for any non-2XX API responses. + */ +public class ApiClientApiException extends ApiClientException { + /** + * The error code of the response that triggered the exception. + */ + private final int statusCode; + + /** + * The body of the response that triggered the exception. + */ + private final Object body; + + private final Map> headers; + + public ApiClientApiException(String message, int statusCode, Object body) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + } + + public ApiClientApiException(String message, int statusCode, Object body, Response rawResponse) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + this.headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + } + + /** + * @return the statusCode + */ + public int statusCode() { + return this.statusCode; + } + + /** + * @return the body + */ + public Object body() { + return this.body; + } + + /** + * @return the headers + */ + public Map> headers() { + return this.headers; + } + + @Override + public String toString() { + return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + body + + "}"; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java new file mode 100644 index 00000000..f08afa2e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientException.java @@ -0,0 +1,17 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +/** + * This class serves as the base exception for all errors in the SDK. + */ +public class ApiClientException extends RuntimeException { + public ApiClientException(String message) { + super(message); + } + + public ApiClientException(String message, Exception e) { + super(message, e); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java new file mode 100644 index 00000000..8a28d22f --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ApiClientHttpResponse.java @@ -0,0 +1,38 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.Response; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class ApiClientHttpResponse { + + private final T body; + + private final Map> headers; + + public ApiClientHttpResponse(T body, Response rawResponse) { + this.body = body; + + Map> headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + this.headers = headers; + } + + public T body() { + return this.body; + } + + public Map> headers() { + return headers; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java new file mode 100644 index 00000000..4eee6b92 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ClientOptions.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.OkHttpClient; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +public final class ClientOptions { + private final Environment environment; + + private final Map headers; + + private final Map> headerSuppliers; + + private final OkHttpClient httpClient; + + private final int timeout; + + private ClientOptions( + Environment environment, + Map headers, + Map> headerSuppliers, + OkHttpClient httpClient, + int timeout) { + this.environment = environment; + this.headers = new HashMap<>(); + this.headers.putAll(headers); + this.headers.putAll(new HashMap() { + { + put("X-Fern-Language", "JAVA"); + put("X-Fern-SDK-Name", "com.skyflow.generated.rest.fern:api-sdk"); + put("X-Fern-SDK-Version", "0.0.279"); + } + }); + this.headerSuppliers = headerSuppliers; + this.httpClient = httpClient; + this.timeout = timeout; + } + + public Environment environment() { + return this.environment; + } + + public Map headers(RequestOptions requestOptions) { + Map values = new HashMap<>(this.headers); + headerSuppliers.forEach((key, supplier) -> { + values.put(key, supplier.get()); + }); + if (requestOptions != null) { + values.putAll(requestOptions.getHeaders()); + } + return values; + } + + public int timeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.timeout; + } + return requestOptions.getTimeout().orElse(this.timeout); + } + + public OkHttpClient httpClient() { + return this.httpClient; + } + + public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.httpClient; + } + return this.httpClient + .newBuilder() + .callTimeout(requestOptions.getTimeout().get(), requestOptions.getTimeoutTimeUnit()) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .build(); + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private Environment environment; + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + private int maxRetries = 2; + + private Optional timeout = Optional.empty(); + + private OkHttpClient httpClient = null; + + public Builder environment(Environment environment) { + this.environment = environment; + return this; + } + + public Builder addHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(int timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(Optional timeout) { + this.timeout = timeout; + return this; + } + + /** + * Override the maximum number of retries. Defaults to 2 retries. + */ + public Builder maxRetries(int maxRetries) { + this.maxRetries = maxRetries; + return this; + } + + public Builder httpClient(OkHttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + public ClientOptions build() { + OkHttpClient.Builder httpClientBuilder = + this.httpClient != null ? this.httpClient.newBuilder() : new OkHttpClient.Builder(); + + if (this.httpClient != null) { + timeout.ifPresent(timeout -> httpClientBuilder + .callTimeout(timeout, TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS)); + } else { + httpClientBuilder + .callTimeout(this.timeout.orElse(60), TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .addInterceptor(new RetryInterceptor(this.maxRetries)); + } + + this.httpClient = httpClientBuilder.build(); + this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); + + return new ClientOptions(environment, headers, headerSuppliers, httpClient, this.timeout.get()); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java new file mode 100644 index 00000000..dfa25a82 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/DateTimeDeserializer.java @@ -0,0 +1,56 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalQueries; + +/** + * Custom deserializer that handles converting ISO8601 dates into {@link OffsetDateTime} objects. + */ +class DateTimeDeserializer extends JsonDeserializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule().addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); + } + + /** + * Gets a module wrapping this deserializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + JsonToken token = parser.currentToken(); + if (token == JsonToken.VALUE_NUMBER_INT) { + return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); + } else { + TemporalAccessor temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( + parser.getValueAsString(), OffsetDateTime::from, LocalDateTime::from); + + if (temporal.query(TemporalQueries.offset()) == null) { + return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); + } else { + return OffsetDateTime.from(temporal); + } + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java new file mode 100644 index 00000000..098667c0 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/Environment.java @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +public final class Environment { + public static final Environment PRODUCTION = new Environment("https://manage.skyflowapis.com"); + + public static final Environment SANDBOX = new Environment("https://manage.skyflowapis-preview.com"); + + private final String url; + + private Environment(String url) { + this.url = url; + } + + public String getUrl() { + return this.url; + } + + public static Environment custom(String url) { + return new Environment(url); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java new file mode 100644 index 00000000..0e878ed3 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/FileStream.java @@ -0,0 +1,61 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import org.jetbrains.annotations.Nullable; + +import java.io.InputStream; +import java.util.Objects; + +/** + * Represents a file stream with associated metadata for file uploads. + */ +public class FileStream { + private final InputStream inputStream; + private final String fileName; + private final MediaType contentType; + + /** + * Constructs a FileStream with the given input stream and optional metadata. + * + * @param inputStream The input stream of the file content. Must not be null. + * @param fileName The name of the file, or null if unknown. + * @param contentType The MIME type of the file content, or null if unknown. + * @throws NullPointerException if inputStream is null + */ + public FileStream(InputStream inputStream, @Nullable String fileName, @Nullable MediaType contentType) { + this.inputStream = Objects.requireNonNull(inputStream, "Input stream cannot be null"); + this.fileName = fileName; + this.contentType = contentType; + } + + public FileStream(InputStream inputStream) { + this(inputStream, null, null); + } + + public InputStream getInputStream() { + return inputStream; + } + + @Nullable + public String getFileName() { + return fileName; + } + + @Nullable + public MediaType getContentType() { + return contentType; + } + + /** + * Creates a RequestBody suitable for use with OkHttp client. + * + * @return A RequestBody instance representing this file stream. + */ + public RequestBody toRequestBody() { + return new InputStreamRequestBody(contentType, inputStream); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java new file mode 100644 index 00000000..a94faec9 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/InputStreamRequestBody.java @@ -0,0 +1,80 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.internal.Util; +import okio.BufferedSink; +import okio.Okio; +import okio.Source; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +/** + * A custom implementation of OkHttp's RequestBody that wraps an InputStream. + * This class allows streaming of data from an InputStream directly to an HTTP request body, + * which is useful for file uploads or sending large amounts of data without loading it all into memory. + */ +public class InputStreamRequestBody extends RequestBody { + private final InputStream inputStream; + private final MediaType contentType; + + /** + * Constructs an InputStreamRequestBody with the specified content type and input stream. + * + * @param contentType the MediaType of the content, or null if not known + * @param inputStream the InputStream containing the data to be sent + * @throws NullPointerException if inputStream is null + */ + public InputStreamRequestBody(@Nullable MediaType contentType, InputStream inputStream) { + this.contentType = contentType; + this.inputStream = Objects.requireNonNull(inputStream, "inputStream == null"); + } + + /** + * Returns the content type of this request body. + * + * @return the MediaType of the content, or null if not specified + */ + @Nullable + @Override + public MediaType contentType() { + return contentType; + } + + /** + * Returns the content length of this request body, if known. + * This method attempts to determine the length using the InputStream's available() method, + * which may not always accurately reflect the total length of the stream. + * + * @return the content length, or -1 if the length is unknown + * @throws IOException if an I/O error occurs + */ + @Override + public long contentLength() throws IOException { + return inputStream.available() == 0 ? -1 : inputStream.available(); + } + + /** + * Writes the content of the InputStream to the given BufferedSink. + * This method is responsible for transferring the data from the InputStream to the network request. + * + * @param sink the BufferedSink to write the content to + * @throws IOException if an I/O error occurs during writing + */ + @Override + public void writeTo(BufferedSink sink) throws IOException { + Source source = null; + try { + source = Okio.source(inputStream); + sink.writeAll(source); + } finally { + Util.closeQuietly(Objects.requireNonNull(source)); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java new file mode 100644 index 00000000..d4374647 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/MediaTypes.java @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.MediaType; + +public final class MediaTypes { + + public static final MediaType APPLICATION_JSON = MediaType.parse("application/json"); + + private MediaTypes() {} +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java new file mode 100644 index 00000000..efabe806 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/Nullable.java @@ -0,0 +1,140 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import java.util.Optional; +import java.util.function.Function; + +public final class Nullable { + + private final Either, Null> value; + + private Nullable() { + this.value = Either.left(Optional.empty()); + } + + private Nullable(T value) { + if (value == null) { + this.value = Either.right(Null.INSTANCE); + } else { + this.value = Either.left(Optional.of(value)); + } + } + + public static Nullable ofNull() { + return new Nullable<>(null); + } + + public static Nullable of(T value) { + return new Nullable<>(value); + } + + public static Nullable empty() { + return new Nullable<>(); + } + + public static Nullable ofOptional(Optional value) { + if (value.isPresent()) { + return of(value.get()); + } else { + return empty(); + } + } + + public boolean isNull() { + return this.value.isRight(); + } + + public boolean isEmpty() { + return this.value.isLeft() && !this.value.getLeft().isPresent(); + } + + public T get() { + if (this.isNull()) { + return null; + } + + return this.value.getLeft().get(); + } + + public Nullable map(Function mapper) { + if (this.isNull()) { + return Nullable.ofNull(); + } + + return Nullable.ofOptional(this.value.getLeft().map(mapper)); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof Nullable)) { + return false; + } + + if (((Nullable) other).isNull() && this.isNull()) { + return true; + } + + return this.value.getLeft().equals(((Nullable) other).value.getLeft()); + } + + private static final class Either { + private L left = null; + private R right = null; + + private Either(L left, R right) { + if (left != null && right != null) { + throw new IllegalArgumentException("Left and right argument cannot both be non-null."); + } + + if (left == null && right == null) { + throw new IllegalArgumentException("Left and right argument cannot both be null."); + } + + if (left != null) { + this.left = left; + } + + if (right != null) { + this.right = right; + } + } + + public static Either left(L left) { + return new Either<>(left, null); + } + + public static Either right(R right) { + return new Either<>(null, right); + } + + public boolean isLeft() { + return this.left != null; + } + + public boolean isRight() { + return this.right != null; + } + + public L getLeft() { + if (!this.isLeft()) { + throw new IllegalArgumentException("Cannot get left from right Either."); + } + return this.left; + } + + public R getRight() { + if (!this.isRight()) { + throw new IllegalArgumentException("Cannot get right from left Either."); + } + return this.right; + } + } + + private static final class Null { + private static final Null INSTANCE = new Null(); + + private Null() {} + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java new file mode 100644 index 00000000..dd32d66c --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/NullableNonemptyFilter.java @@ -0,0 +1,19 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import java.util.Optional; + +public final class NullableNonemptyFilter { + @Override + public boolean equals(Object o) { + boolean isOptionalEmpty = isOptionalEmpty(o); + + return isOptionalEmpty; + } + + private boolean isOptionalEmpty(Object o) { + return o instanceof Optional && !((Optional) o).isPresent(); + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java new file mode 100644 index 00000000..4997b3ca --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ObjectMappers.java @@ -0,0 +1,37 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import java.io.IOException; + +public final class ObjectMappers { + public static final ObjectMapper JSON_MAPPER = JsonMapper.builder() + .addModule(new Jdk8Module()) + .addModule(new JavaTimeModule()) + .addModule(DateTimeDeserializer.getModule()) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .build(); + + private ObjectMappers() {} + + public static String stringify(Object o) { + try { + return JSON_MAPPER + .setSerializationInclusion(JsonInclude.Include.ALWAYS) + .writerWithDefaultPrettyPrinter() + .writeValueAsString(o); + } catch (IOException e) { + return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java new file mode 100644 index 00000000..8b1f9f7e --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/QueryStringMapper.java @@ -0,0 +1,139 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; + +import java.util.*; + +public class QueryStringMapper { + + private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; + + public static void addQueryParameter(HttpUrl.Builder httpUrl, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + httpUrl.addQueryParameter(key, valueNode.textValue()); + } else { + httpUrl.addQueryParameter(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().textValue()); + } else { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().toString()); + } + } + } + + public static void addFormDataPart( + MultipartBody.Builder multipartBody, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + multipartBody.addFormDataPart(key, valueNode.textValue()); + } else { + multipartBody.addFormDataPart(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().textValue()); + } else { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().toString()); + } + } + } + + public static List> flattenObject(ObjectNode object, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator> fields = object.fields(); + while (fields.hasNext()) { + Map.Entry field = fields.next(); + + String key = "[" + field.getKey() + "]"; + + if (field.getValue().isObject()) { + List> flatField = + flattenObject((ObjectNode) field.getValue(), arraysAsRepeats); + addAll(flat, flatField, key); + } else if (field.getValue().isArray()) { + List> flatField = + flattenArray((ArrayNode) field.getValue(), key, arraysAsRepeats); + addAll(flat, flatField, ""); + } else { + flat.add(new AbstractMap.SimpleEntry<>(key, field.getValue())); + } + } + + return flat; + } + + private static List> flattenArray( + ArrayNode array, String key, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator elements = array.elements(); + + int index = 0; + while (elements.hasNext()) { + JsonNode element = elements.next(); + + String indexKey = key + "[" + index + "]"; + + if (arraysAsRepeats) { + indexKey = key; + } + + if (element.isObject()) { + List> flatField = flattenObject((ObjectNode) element, arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else if (element.isArray()) { + List> flatField = flattenArray((ArrayNode) element, "", arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else { + flat.add(new AbstractMap.SimpleEntry<>(indexKey, element)); + } + + index++; + } + + return flat; + } + + private static void addAll( + List> target, List> source, String prefix) { + for (Map.Entry entry : source) { + Map.Entry entryToAdd = + new AbstractMap.SimpleEntry<>(prefix + entry.getKey(), entry.getValue()); + target.add(entryToAdd); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java new file mode 100644 index 00000000..b70c02df --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/RequestOptions.java @@ -0,0 +1,101 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +public final class RequestOptions { + private final String token; + + private final Optional timeout; + + private final TimeUnit timeoutTimeUnit; + + private final Map headers; + + private final Map> headerSuppliers; + + private RequestOptions( + String token, + Optional timeout, + TimeUnit timeoutTimeUnit, + Map headers, + Map> headerSuppliers) { + this.token = token; + this.timeout = timeout; + this.timeoutTimeUnit = timeoutTimeUnit; + this.headers = headers; + this.headerSuppliers = headerSuppliers; + } + + public Optional getTimeout() { + return timeout; + } + + public TimeUnit getTimeoutTimeUnit() { + return timeoutTimeUnit; + } + + public Map getHeaders() { + Map headers = new HashMap<>(); + if (this.token != null) { + headers.put("Authorization", "Bearer " + this.token); + } + headers.putAll(this.headers); + this.headerSuppliers.forEach((key, supplier) -> { + headers.put(key, supplier.get()); + }); + return headers; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private String token = null; + + private Optional timeout = Optional.empty(); + + private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + public Builder token(String token) { + this.token = token; + return this; + } + + public Builder timeout(Integer timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { + this.timeout = Optional.of(timeout); + this.timeoutTimeUnit = timeoutTimeUnit; + return this; + } + + public Builder addHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + public RequestOptions build() { + return new RequestOptions(token, timeout, timeoutTimeUnit, headers, headerSuppliers); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java new file mode 100644 index 00000000..1d0a9110 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyInputStream.java @@ -0,0 +1,46 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.Response; + +import java.io.FilterInputStream; +import java.io.IOException; + +/** + * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the + * OkHttp Response object is properly closed when the stream is closed. + * + * This class extends FilterInputStream and takes an OkHttp Response object as a parameter. + * It retrieves the InputStream from the Response and overrides the close method to close + * both the InputStream and the Response object, ensuring proper resource management and preventing + * premature closure of the underlying HTTP connection. + */ +public class ResponseBodyInputStream extends FilterInputStream { + private final Response response; + + /** + * Constructs a ResponseBodyInputStream that wraps the InputStream from the given OkHttp + * Response object. + * + * @param response the OkHttp Response object from which the InputStream is retrieved + * @throws IOException if an I/O error occurs while retrieving the InputStream + */ + public ResponseBodyInputStream(Response response) throws IOException { + super(response.body().byteStream()); + this.response = response; + } + + /** + * Closes the InputStream and the associated OkHttp Response object. This ensures that the + * underlying HTTP connection is properly closed after the stream is no longer needed. + * + * @throws IOException if an I/O error occurs + */ + @Override + public void close() throws IOException { + super.close(); + response.close(); // Ensure the response is closed when the stream is closed + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java new file mode 100644 index 00000000..f4dfb17b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/ResponseBodyReader.java @@ -0,0 +1,45 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.Response; + +import java.io.FilterReader; +import java.io.IOException; + +/** + * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the + * OkHttp Response object is properly closed when the reader is closed. + * + * This class extends FilterReader and takes an OkHttp Response object as a parameter. + * It retrieves the Reader from the Response and overrides the close method to close + * both the Reader and the Response object, ensuring proper resource management and preventing + * premature closure of the underlying HTTP connection. + */ +public class ResponseBodyReader extends FilterReader { + private final Response response; + + /** + * Constructs a ResponseBodyReader that wraps the Reader from the given OkHttp Response object. + * + * @param response the OkHttp Response object from which the Reader is retrieved + * @throws IOException if an I/O error occurs while retrieving the Reader + */ + public ResponseBodyReader(Response response) throws IOException { + super(response.body().charStream()); + this.response = response; + } + + /** + * Closes the Reader and the associated OkHttp Response object. This ensures that the + * underlying HTTP connection is properly closed after the reader is no longer needed. + * + * @throws IOException if an I/O error occurs + */ + @Override + public void close() throws IOException { + super.close(); + response.close(); // Ensure the response is closed when the reader is closed + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java new file mode 100644 index 00000000..8344b974 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/RetryInterceptor.java @@ -0,0 +1,79 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import okhttp3.Interceptor; +import okhttp3.Response; + +import java.io.IOException; +import java.time.Duration; +import java.util.Optional; +import java.util.Random; + +public class RetryInterceptor implements Interceptor { + + private static final Duration ONE_SECOND = Duration.ofSeconds(1); + private final ExponentialBackoff backoff; + private final Random random = new Random(); + + public RetryInterceptor(int maxRetries) { + this.backoff = new ExponentialBackoff(maxRetries); + } + + @Override + public Response intercept(Chain chain) throws IOException { + Response response = chain.proceed(chain.request()); + + if (shouldRetry(response.code())) { + return retryChain(response, chain); + } + + return response; + } + + private Response retryChain(Response response, Chain chain) throws IOException { + Optional nextBackoff = this.backoff.nextBackoff(); + while (nextBackoff.isPresent()) { + try { + Thread.sleep(nextBackoff.get().toMillis()); + } catch (InterruptedException e) { + throw new IOException("Interrupted while trying request", e); + } + response.close(); + response = chain.proceed(chain.request()); + if (shouldRetry(response.code())) { + nextBackoff = this.backoff.nextBackoff(); + } else { + return response; + } + } + + return response; + } + + private static boolean shouldRetry(int statusCode) { + return statusCode == 408 || statusCode == 429 || statusCode >= 500; + } + + private final class ExponentialBackoff { + + private final int maxNumRetries; + + private int retryNumber = 0; + + ExponentialBackoff(int maxNumRetries) { + this.maxNumRetries = maxNumRetries; + } + + public Optional nextBackoff() { + retryNumber += 1; + if (retryNumber > maxNumRetries) { + return Optional.empty(); + } + + int upperBound = (int) Math.pow(2, retryNumber); + return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); + } + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java new file mode 100644 index 00000000..4a984faa --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/Stream.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import java.io.Reader; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Scanner; + +/** + * The {@code Stream} class implements {@link Iterable} to provide a simple mechanism for reading and parsing + * objects of a given type from data streamed via a {@link Reader} using a specified delimiter. + *

+ * {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a + * {@code Scanner} to block during iteration if the next object is not available. + * + * @param The type of objects in the stream. + */ +public final class Stream implements Iterable { + /** + * The {@link Class} of the objects in the stream. + */ + private final Class valueType; + /** + * The {@link Scanner} used for reading from the input stream and blocking when needed during iteration. + */ + private final Scanner scanner; + + /** + * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. + * + * @param valueType The class of the objects in the stream. + * @param reader The reader that provides the streamed data. + * @param delimiter The delimiter used to separate elements in the stream. + */ + public Stream(Class valueType, Reader reader, String delimiter) { + this.scanner = new Scanner(reader).useDelimiter(delimiter); + this.valueType = valueType; + } + + /** + * Returns an iterator over the elements in this stream that blocks during iteration when the next object is + * not yet available. + * + * @return An iterator that can be used to traverse the elements in the stream. + */ + @Override + public Iterator iterator() { + return new Iterator() { + /** + * Returns {@code true} if there are more elements in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return {@code true} if there are more elements, {@code false} otherwise. + */ + @Override + public boolean hasNext() { + return scanner.hasNext(); + } + + /** + * Returns the next element in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return The next element in the stream. + * @throws NoSuchElementException If there are no more elements in the stream. + */ + @Override + public T next() { + if (!scanner.hasNext()) { + throw new NoSuchElementException(); + } else { + try { + T parsedResponse = ObjectMappers.JSON_MAPPER.readValue( + scanner.next().trim(), valueType); + return parsedResponse; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * Removing elements from {@code Stream} is not supported. + * + * @throws UnsupportedOperationException Always, as removal is not supported. + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java b/common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java new file mode 100644 index 00000000..d3ab5e53 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/core/Suppliers.java @@ -0,0 +1,23 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.core; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public final class Suppliers { + private Suppliers() {} + + public static Supplier memoize(Supplier delegate) { + AtomicReference value = new AtomicReference<>(); + return () -> { + T val = value.get(); + if (val == null) { + val = value.updateAndGet(cur -> cur == null ? Objects.requireNonNull(delegate.get()) : cur); + } + return val; + }; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java new file mode 100644 index 00000000..4517200d --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/errors/BadRequestError.java @@ -0,0 +1,34 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.errors; + +import com.skyflow.generated.auth.rest.core.ApiClientApiException; +import okhttp3.Response; + +import java.util.Map; + +public final class BadRequestError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final Map body; + + public BadRequestError(Map body) { + super("BadRequestError", 400, body); + this.body = body; + } + + public BadRequestError(Map body, Response rawResponse) { + super("BadRequestError", 400, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @Override + public Map body() { + return this.body; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java new file mode 100644 index 00000000..2e1c45d2 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/errors/HttpStatus.java @@ -0,0 +1,15 @@ +package com.skyflow.generated.auth.rest.errors; + +public enum HttpStatus { + BAD_REQUEST("Bad Request"); + + private final String httpStatus; + + HttpStatus(String httpStatus) { + this.httpStatus = httpStatus; + } + + public String getHttpStatus() { + return httpStatus; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java new file mode 100644 index 00000000..60a1771c --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/errors/NotFoundError.java @@ -0,0 +1,34 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.errors; + +import com.skyflow.generated.auth.rest.core.ApiClientApiException; +import okhttp3.Response; + +import java.util.Map; + +public final class NotFoundError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final Map body; + + public NotFoundError(Map body) { + super("NotFoundError", 404, body); + this.body = body; + } + + public NotFoundError(Map body, Response rawResponse) { + super("NotFoundError", 404, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @Override + public Map body() { + return this.body; + } +} diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java b/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java new file mode 100644 index 00000000..42f1c624 --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/errors/UnauthorizedError.java @@ -0,0 +1,34 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.errors; + +import com.skyflow.generated.auth.rest.core.ApiClientApiException; +import okhttp3.Response; + +import java.util.Map; + +public final class UnauthorizedError extends ApiClientApiException { + /** + * The body of the response that triggered the exception. + */ + private final Map body; + + public UnauthorizedError(Map body) { + super("UnauthorizedError", 401, body); + this.body = body; + } + + public UnauthorizedError(Map body, Response rawResponse) { + super("UnauthorizedError", 401, body, rawResponse); + this.body = body; + } + + /** + * @return the body + */ + @Override + public Map body() { + return this.body; + } +} diff --git a/src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java similarity index 84% rename from src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncAuthenticationClient.java rename to common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java index 43ffab73..c742b239 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncAuthenticationClient.java +++ b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncAuthenticationClient.java @@ -1,12 +1,13 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.authentication; +package com.skyflow.generated.auth.rest.resources.authentication; + +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.RequestOptions; +import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; +import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.rest.types.V1GetAuthTokenResponse; import java.util.concurrent.CompletableFuture; public class AsyncAuthenticationClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncRawAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java similarity index 82% rename from src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncRawAuthenticationClient.java rename to common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java index eca4ab90..56a47dc0 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/authentication/AsyncRawAuthenticationClient.java +++ b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AsyncRawAuthenticationClient.java @@ -1,33 +1,22 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.authentication; +package com.skyflow.generated.auth.rest.resources.authentication; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.rest.types.V1GetAuthTokenResponse; +import com.fasterxml.jackson.core.type.TypeReference; +import com.skyflow.generated.auth.rest.core.*; +import com.skyflow.generated.auth.rest.errors.BadRequestError; +import com.skyflow.generated.auth.rest.errors.NotFoundError; +import com.skyflow.generated.auth.rest.errors.UnauthorizedError; +import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; +import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; +import java.util.Map; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawAuthenticationClient { protected final ClientOptions clientOptions; @@ -88,17 +77,20 @@ public void onResponse(@NotNull Call call, @NotNull Response response) throws IO switch (response.code()) { case 400: future.completeExceptionally(new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), response)); return; case 401: future.completeExceptionally(new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), response)); return; case 404: future.completeExceptionally(new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), response)); return; } diff --git a/src/main/java/com/skyflow/generated/rest/resources/authentication/AuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java similarity index 82% rename from src/main/java/com/skyflow/generated/rest/resources/authentication/AuthenticationClient.java rename to common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java index 662bfb3d..a0ba860a 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/authentication/AuthenticationClient.java +++ b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/AuthenticationClient.java @@ -1,12 +1,12 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.authentication; +package com.skyflow.generated.auth.rest.resources.authentication; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.rest.types.V1GetAuthTokenResponse; +import com.skyflow.generated.auth.rest.core.ClientOptions; +import com.skyflow.generated.auth.rest.core.RequestOptions; +import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; +import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; public class AuthenticationClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/authentication/RawAuthenticationClient.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java similarity index 78% rename from src/main/java/com/skyflow/generated/rest/resources/authentication/RawAuthenticationClient.java rename to common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java index 3d242eff..6c52c048 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/authentication/RawAuthenticationClient.java +++ b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/RawAuthenticationClient.java @@ -1,29 +1,20 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.authentication; +package com.skyflow.generated.auth.rest.resources.authentication; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.errors.BadRequestError; -import com.skyflow.generated.rest.errors.NotFoundError; -import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.rest.types.V1GetAuthTokenResponse; +import com.fasterxml.jackson.core.type.TypeReference; +import com.skyflow.generated.auth.rest.core.*; +import com.skyflow.generated.auth.rest.errors.BadRequestError; +import com.skyflow.generated.auth.rest.errors.NotFoundError; +import com.skyflow.generated.auth.rest.errors.UnauthorizedError; +import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; +import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; +import java.util.Map; public class RawAuthenticationClient { protected final ClientOptions clientOptions; @@ -79,13 +70,19 @@ public ApiClientHttpResponse authenticationServiceGetAut switch (response.code()) { case 400: throw new BadRequestError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), + response); case 401: throw new UnauthorizedError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), + response); case 404: throw new NotFoundError( - ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), response); + ObjectMappers.JSON_MAPPER.readValue( + responseBodyString, new TypeReference>() {}), + response); } } catch (JsonProcessingException ignored) { // unable to map error response, throwing generic error diff --git a/src/main/java/com/skyflow/generated/rest/resources/authentication/requests/V1GetAuthTokenRequest.java b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/resources/authentication/requests/V1GetAuthTokenRequest.java rename to common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java index 182952bc..382c5431 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/authentication/requests/V1GetAuthTokenRequest.java +++ b/common/src/main/java/com/skyflow/generated/auth/rest/resources/authentication/requests/V1GetAuthTokenRequest.java @@ -1,22 +1,17 @@ /** * This file was auto-generated by Fern from our API Definition. */ -package com.skyflow.generated.rest.resources.authentication.requests; - -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +package com.skyflow.generated.auth.rest.resources.authentication.requests; + +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.auth.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1GetAuthTokenRequest.Builder.class) diff --git a/common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java b/common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java new file mode 100644 index 00000000..3db2f22b --- /dev/null +++ b/common/src/main/java/com/skyflow/generated/auth/rest/types/V1GetAuthTokenResponse.java @@ -0,0 +1,125 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.auth.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.auth.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1GetAuthTokenResponse.Builder.class) +public final class V1GetAuthTokenResponse { + private final Optional accessToken; + + private final Optional tokenType; + + private final Map additionalProperties; + + private V1GetAuthTokenResponse( + Optional accessToken, Optional tokenType, Map additionalProperties) { + this.accessToken = accessToken; + this.tokenType = tokenType; + this.additionalProperties = additionalProperties; + } + + /** + * @return AccessToken. + */ + @JsonProperty("accessToken") + public Optional getAccessToken() { + return accessToken; + } + + /** + * @return TokenType : Bearer. + */ + @JsonProperty("tokenType") + public Optional getTokenType() { + return tokenType; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1GetAuthTokenResponse && equalTo((V1GetAuthTokenResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1GetAuthTokenResponse other) { + return accessToken.equals(other.accessToken) && tokenType.equals(other.tokenType); + } + + @Override + public int hashCode() { + return Objects.hash(this.accessToken, this.tokenType); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional accessToken = Optional.empty(); + + private Optional tokenType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1GetAuthTokenResponse other) { + accessToken(other.getAccessToken()); + tokenType(other.getTokenType()); + return this; + } + + /** + *

AccessToken.

+ */ + @JsonSetter(value = "accessToken", nulls = Nulls.SKIP) + public Builder accessToken(Optional accessToken) { + this.accessToken = accessToken; + return this; + } + + public Builder accessToken(String accessToken) { + this.accessToken = Optional.ofNullable(accessToken); + return this; + } + + /** + *

TokenType : Bearer.

+ */ + @JsonSetter(value = "tokenType", nulls = Nulls.SKIP) + public Builder tokenType(Optional tokenType) { + this.tokenType = tokenType; + return this; + } + + public Builder tokenType(String tokenType) { + this.tokenType = Optional.ofNullable(tokenType); + return this; + } + + public V1GetAuthTokenResponse build() { + return new V1GetAuthTokenResponse(accessToken, tokenType, additionalProperties); + } + } +} diff --git a/src/main/java/com/skyflow/logs/ErrorLogs.java b/common/src/main/java/com/skyflow/logs/ErrorLogs.java similarity index 74% rename from src/main/java/com/skyflow/logs/ErrorLogs.java rename to common/src/main/java/com/skyflow/logs/ErrorLogs.java index 47866efc..bbb96fce 100644 --- a/src/main/java/com/skyflow/logs/ErrorLogs.java +++ b/common/src/main/java/com/skyflow/logs/ErrorLogs.java @@ -8,6 +8,7 @@ public enum ErrorLogs { EMPTY_VAULT_ID("Invalid vault config. Vault ID can not be empty."), CLUSTER_ID_IS_REQUIRED("Invalid vault config. Cluster ID is required."), EMPTY_CLUSTER_ID("Invalid vault config. Cluster ID can not be empty."), + EITHER_VAULT_URL_OR_CLUSTER_ID_REQUIRED("Invalid vault config. At least one of \"clusterId\" or \"vaultURL\" must be provided."), CONNECTION_CONFIG_EXISTS("Connection config with connection ID %s1 already exists."), CONNECTION_CONFIG_DOES_NOT_EXIST("Connection config with connection ID %s1 doesn't exist."), CONNECTION_ID_IS_REQUIRED("Invalid connection config. Connection ID is required."), @@ -27,6 +28,8 @@ public enum ErrorLogs { EMPTY_OR_NULL_CONTEXT("Invalid credentials. Context can not be empty."), INVALID_CONTEXT_TYPE("Invalid credentials. Context must be a String or Map."), INVALID_CONTEXT_MAP_KEY("Invalid credentials. Context map key '%s1' contains invalid characters."), + EMPTY_VAULT_URL("Invalid vault config. Vault URL can not be empty."), + INVALID_VAULT_URL_FORMAT("Invalid vault config. Vault URL format is incorrect"), // Bearer token generation INVALID_BEARER_TOKEN("Bearer token is invalid or expired."), @@ -50,12 +53,22 @@ public enum ErrorLogs { TABLE_IS_REQUIRED("Invalid %s1 request. Table is required."), EMPTY_TABLE_NAME("Invalid %s1 request. Table name can not be empty."), VALUES_IS_REQUIRED("Invalid %s1 request. Values are required."), + EMPTY_VALUES("Invalid %s1 request. Values can not be empty."), + INSERT_REQUEST_NULL("Invalid %s1 request. Insert request can not be null."), + RECORDS_IS_REQUIRED("Invalid %s1 request. Records are required."), + EMPTY_RECORDS("Invalid %s1 request. Records can not be empty."), + INVALID_RECORD("Invalid %s1 request. Invalid record. Specify a valid record."), + RECORD_SIZE_EXCEED("Maximum number of records exceeded. The limit is 10000."), + TOKENS_SIZE_EXCEED("Maximum number of tokens exceeded. The limit is 10000."), + EMPTY_OR_NULL_VALUE_IN_VALUES("Invalid %s1 request. Value can not be null or empty in values for key \"%s2\"."), EMPTY_OR_NULL_KEY_IN_VALUES("Invalid %s1 request. Key can not be null or empty in values"), EMPTY_UPSERT("Invalid %s1 request. Upsert can not be empty."), + EMPTY_UPSERT_VALUES("Invalid %s1 request. Upsert values can not be empty."), HOMOGENOUS_NOT_SUPPORTED_WITH_UPSERT("Invalid %s1 request. Homogenous is not supported when upsert is passed."), TOKENS_NOT_ALLOWED_WITH_TOKEN_MODE_DISABLE("Invalid %s1 request. Tokens are not allowed when tokenMode is DISABLE."), TOKENS_REQUIRED_WITH_TOKEN_MODE("Invalid %s1 request. Tokens are required when tokenMode is %s2."), EMPTY_TOKENS("Invalid %s1 request. Tokens can not be empty."), + EMPTY_OR_NULL_VALUE_IN_TOKENS("Invalid %s1 request. Value can not be null or empty in tokens for key \"%s2\"."), EMPTY_OR_NULL_KEY_IN_TOKENS("Invalid %s1 request. Key can not be null or empty in tokens."), INSUFFICIENT_TOKENS_PASSED_FOR_TOKEN_MODE_ENABLE_STRICT("Invalid %s1 request. For tokenMode as ENABLE_STRICT, tokens should be passed for all fields."), MISMATCH_OF_FIELDS_AND_TOKENS("Invalid %s1 request. Keys for values and tokens are not matching."), @@ -65,6 +78,15 @@ public enum ErrorLogs { EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA("Invalid %s1 request. Token can not be null or empty in detokenize data at index %s2."), REDACTION_IS_REQUIRED("Invalid %s1 request. Redaction is required."), DETOKENIZE_REQUEST_REJECTED("Detokenize request resulted in failure."), + DETOKENIZE_REQUEST_NULL("Invalid %s1 request. Detokenize request can not be null."), + + NULL_TOKEN_REDACTION_GROUP_OBJECT("Invalid %s1 request. Token Redaction group object can not be null or empty."), + + NULL_REDACTION_IN_TOKEN_GROUP("Invalid %s1 request. Redaction can not be null in token redaction group"), + + NULL_TOKEN_GROUP_NAME_IN_TOKEN_GROUP("Invalid %s1 request. Token group name can not be null in token redaction group"), + + EMPTY_OR_NULL_REDACTION_IN_TOKEN_GROUP("Invalid %s1 request. Redaction can not be null or empty in token redaction group"), IDS_IS_REQUIRED("Invalid %s1 request. Ids are required."), EMPTY_IDS("Invalid %s1 request. Ids can not be empty."), EMPTY_OR_NULL_ID_IN_IDS("Invalid %s1 request. Id can not be null or empty in ids at index %s2."), @@ -94,7 +116,19 @@ public enum ErrorLogs { COLUMN_VALUES_IS_REQUIRED_TOKENIZE("Invalid %s1 request. ColumnValues are required."), EMPTY_OR_NULL_COLUMN_GROUP_IN_COLUMN_VALUES("Invalid %s1 request. Column group can not be null or empty in column values at index %s2."), TOKENIZE_REQUEST_REJECTED("Tokenize request resulted in failure."), + TOKENIZE_REQUEST_NULL("Invalid %s1 request. Tokenize request can not be null."), + EMPTY_TOKENIZE_DATA("Invalid %s1 request. Tokenize data can not be empty."), + TOKENIZE_RECORD_NULL("Invalid %s1 request. TokenizeRecord in list can not be null."), + EMPTY_VALUE_IN_TOKENIZE_RECORD("Invalid %s1 request. Value in TokenizeRecord can not be null or empty."), + EMPTY_TOKEN_GROUP_NAMES_IN_TOKENIZE_RECORD("Invalid %s1 request. TokenGroupNames in TokenizeRecord can not be null or empty."), + EMPTY_TOKEN_GROUP_NAME_IN_TOKENIZE_RECORD("Invalid %s1 request. Token group name in TokenizeRecord can not be null or empty at index %s2."), + TOKENIZE_DATA_SIZE_EXCEED("Maximum number of tokenize records exceeded. The limit is 10000."), DELETE_REQUEST_REJECTED("Delete request resulted in failure."), + DELETE_TOKENS_REQUEST_NULL("Invalid %s1 request. DeleteTokens request can not be null."), + EMPTY_DELETE_TOKENS_DATA("Invalid %s1 request. Delete tokens data can not be empty."), + EMPTY_OR_NULL_TOKEN_IN_DELETE_TOKENS_DATA("Invalid %s1 request. Token can not be null or empty in delete tokens data at index %s2."), + DELETE_TOKENS_SIZE_EXCEED("Maximum number of tokens exceeded. The limit is 10000."), + DELETE_TOKENS_REQUEST_REJECTED("DeleteTokens request resulted in failure."), // invoke connection interface INVOKE_CONNECTION_INVALID_CONNECTION_URL("Invalid %s1 request. Connection URL is not a valid URL."), @@ -117,7 +151,6 @@ public enum ErrorLogs { MISSING_FILE_SOURCE_IN_UPLOAD_FILE("Invalid %s1 request. Provide exactly one of filePath, base64, or fileObject."), UPLOAD_FILE_REQUEST_REJECTED("Upload file request resulted in failure."), - // detect interface INVALID_TEXT_IN_DEIDENTIFY("Invalid %s1 request. The text field is required and must be a non-empty string. Specify a valid text."), DEIDENTIFY_TEXT_REQUEST_REJECTED("DeIdentify text request resulted in failure."), @@ -134,8 +167,14 @@ public enum ErrorLogs { OUTPUT_DIRECTORY_NOT_FOUND("Invalid %s1 request. The output directory does not exist. Please specify a valid output directory."), INVALID_PERMISSIONS_FOR_OUTPUT_DIRECTORY("Invalid %s1 request. The output directory is not writable. Please check the permissions or specify a valid output directory."), EMPTY_FILE_AND_FILE_PATH_IN_DEIDENTIFY_FILE("Invalid %s1 request. The file and file path fields are both empty. Specify a valid file object or file path."), - ; + UNEXPECTED_ERROR_DURING_BATCH_PROCESSING("Unexpected error occurred during batch processing. Error: %s1"), + + PROCESSING_ERROR_RESPONSE("Processing error response."), + TABLE_SPECIFIED_AT_BOTH_PLACE("Invalid %s1 request. Table name cannot be specified at both the request and record levels. Please specify the table name at only one place."), + TABLE_NOT_SPECIFIED_AT_BOTH_PLACE("Invalid %s1 request. Table name is missing. Table name should be specified at one place either at the request level or record level. Please specify the table name at one place."), + UPSERT_TABLE_REQUEST_AT_RECORD_LEVEL("Invalid %s1 request. Table name should be present at each record level when upsert is present at record level."), + UPSERT_TABLE_REQUEST_AT_REQUEST_LEVEL("Invalid %s1 request. Upsert should be present at each record level when table name is present at record level."); private final String log; ErrorLogs(String log) { diff --git a/src/main/java/com/skyflow/logs/InfoLogs.java b/common/src/main/java/com/skyflow/logs/InfoLogs.java similarity index 92% rename from src/main/java/com/skyflow/logs/InfoLogs.java rename to common/src/main/java/com/skyflow/logs/InfoLogs.java index e747bfa2..6d6a8211 100644 --- a/src/main/java/com/skyflow/logs/InfoLogs.java +++ b/common/src/main/java/com/skyflow/logs/InfoLogs.java @@ -14,12 +14,14 @@ public enum InfoLogs { // Bearer token generation EMPTY_BEARER_TOKEN("Bearer token is empty."), - BEARER_TOKEN_EXPIRED("Bearer token is invalid or expired."), + BEARER_TOKEN_EXPIRED("Bearer token is expired."), GET_BEARER_TOKEN_TRIGGERED("getBearerToken method triggered."), GET_BEARER_TOKEN_SUCCESS("Bearer token generated."), GET_SIGNED_DATA_TOKENS_TRIGGERED("getSignedDataTokens method triggered."), GET_SIGNED_DATA_TOKEN_SUCCESS("Signed data tokens generated."), REUSE_BEARER_TOKEN("Reusing bearer token."), + USE_CLIENT_PROVIDED_BEARER_TOKEN("Using bearer token provided by client."), + USE_API_KEY("Using api key."), REUSE_API_KEY("Reusing api key."), GENERATE_BEARER_TOKEN_FROM_CREDENTIALS_TRIGGERED("generateBearerTokenFromCredentials method triggered."), GENERATE_BEARER_TOKEN_FROM_CREDENTIALS_STRING_TRIGGERED("generateBearerTokenFromCredentialString method triggered."), @@ -57,6 +59,12 @@ public enum InfoLogs { DELETE_REQUEST_RESOLVED("Delete request resolved."), DELETE_SUCCESS("Data deleted."), + // Delete Tokens interface + DELETE_TOKENS_TRIGGERED("DeleteTokens method triggered."), + VALIDATE_DELETE_TOKENS_REQUEST("Validating delete tokens request."), + DELETE_TOKENS_REQUEST_RESOLVED("DeleteTokens request resolved."), + DELETE_TOKENS_SUCCESS("Tokens deleted."), + // Query interface QUERY_TRIGGERED("Query method triggered."), VALIDATING_QUERY_REQUEST("Validating query request."), @@ -69,11 +77,6 @@ public enum InfoLogs { TOKENIZE_REQUEST_RESOLVED("Tokenize request resolved."), TOKENIZE_SUCCESS("Data tokenized."), - // File upload interface - FILE_UPLOAD_TRIGGERED("File upload method triggered."), - VALIDATING_FILE_UPLOAD_REQUEST("Validating file upload request."), - FILE_UPLOAD_REQUEST_RESOLVED("File upload request resolved."), - FILE_UPLOAD_SUCCESS("File uploaded successfully."), // Invoke connection interface INVOKE_CONNECTION_TRIGGERED("Invoke connection method triggered."), @@ -96,6 +99,14 @@ public enum InfoLogs { VALIDATE_GET_DETECT_RUN_REQUEST("Validating get detect run request."), REIDENTIFY_TEXT_SUCCESS("Text data re-identified."), + // File upload interface + FILE_UPLOAD_TRIGGERED("File upload method triggered."), + VALIDATING_FILE_UPLOAD_REQUEST("Validating file upload request."), + FILE_UPLOAD_REQUEST_RESOLVED("File upload request resolved."), + FILE_UPLOAD_SUCCESS("File uploaded successfully."), + + PROCESSING_BATCHES("Processing batch"), + // Deprecation warnings — v2 backward compat DEPRECATED_SKYFLOW_ID_KEY("[DEPRECATED] Response key 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead."), DEPRECATED_SKYFLOW_ID_REQUEST_KEY("[DEPRECATED] Request data key 'skyflow_id' is deprecated and will be removed in an upcoming release. Use 'skyflowId' instead."), @@ -104,8 +115,8 @@ public enum InfoLogs { DEPRECATED_UPDATE_LOG_LEVEL("[DEPRECATED] Method 'updateLogLevel()' is deprecated and will be removed in an upcoming release. Use 'setLogLevel()' instead."), DEPRECATED_CREDENTIAL_CLIENT_ID("[DEPRECATED] Credential field 'clientID' is deprecated and will be removed in an upcoming release. Use 'clientId' instead."), DEPRECATED_CREDENTIAL_KEY_ID("[DEPRECATED] Credential field 'keyID' is deprecated and will be removed in an upcoming release. Use 'keyId' instead."), - DEPRECATED_CREDENTIAL_TOKEN_URI("[DEPRECATED] Credential field 'tokenURI' is deprecated and will be removed in an upcoming release. Use 'tokenUri' instead."); - + DEPRECATED_CREDENTIAL_TOKEN_URI("[DEPRECATED] Credential field 'tokenURI' is deprecated and will be removed in an upcoming release. Use 'tokenUri' instead.") + ; private final String log; diff --git a/common/src/main/java/com/skyflow/logs/WarningLogs.java b/common/src/main/java/com/skyflow/logs/WarningLogs.java new file mode 100644 index 00000000..1eb1bcd8 --- /dev/null +++ b/common/src/main/java/com/skyflow/logs/WarningLogs.java @@ -0,0 +1,23 @@ +package com.skyflow.logs; + +public enum WarningLogs { + INVALID_BATCH_SIZE_PROVIDED("Invalid value for batch size provided, switching to default value."), + INVALID_CONCURRENCY_LIMIT_PROVIDED("Invalid value for concurrency limit provided, switching to default value."), + BATCH_SIZE_EXCEEDS_MAX_LIMIT("Provided batch size exceeds the maximum limit, switching to max limit."), + CONCURRENCY_EXCEEDS_MAX_LIMIT("Provided concurrency limit exceeds the maximum limit, switching to max limit."), + EMPTY_DELETE_TOKENS_RESPONSE("DeleteTokens response did not include any token results."), + INCOMPLETE_DELETE_TOKENS_RESPONSE("DeleteTokens response did not account for all requested tokens."), + EMPTY_TOKENIZE_RESPONSE("Tokenize response did not include any record results."), + INCOMPLETE_TOKENIZE_RESPONSE("Tokenize response did not account for all requested records.") + ; + + private final String log; + + WarningLogs(String log) { + this.log = log; + } + + public final String getLog() { + return log; + } +} diff --git a/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java similarity index 91% rename from src/main/java/com/skyflow/serviceaccount/util/BearerToken.java rename to common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java index ad7cae30..60c07f6d 100644 --- a/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/BearerToken.java @@ -4,16 +4,16 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.ApiClient; -import com.skyflow.generated.rest.ApiClientBuilder; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.resources.authentication.AuthenticationClient; -import com.skyflow.generated.rest.resources.authentication.requests.V1GetAuthTokenRequest; -import com.skyflow.generated.rest.types.V1GetAuthTokenResponse; +import com.skyflow.generated.auth.rest.ApiClient; +import com.skyflow.generated.auth.rest.ApiClientBuilder; +import com.skyflow.generated.auth.rest.core.ApiClientApiException; +import com.skyflow.generated.auth.rest.resources.authentication.AuthenticationClient; +import com.skyflow.generated.auth.rest.resources.authentication.requests.V1GetAuthTokenRequest; +import com.skyflow.generated.auth.rest.types.V1GetAuthTokenResponse; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.Constants; -import com.skyflow.utils.Utils; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.BaseUtils; import com.skyflow.utils.logger.LogUtil; import io.jsonwebtoken.Jwts; @@ -65,13 +65,13 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentials( } finally { try { reader.close(); } catch (IOException ignored) {} } - } catch (JsonSyntaxException e) { + } catch (JsonSyntaxException | IllegalStateException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE_FORMAT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( ErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); } catch (FileNotFoundException e) { LogUtil.printErrorLog(ErrorLogs.CREDENTIALS_FILE_NOT_FOUND.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( ErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); } } @@ -87,7 +87,7 @@ private static V1GetAuthTokenResponse generateBearerTokenFromCredentialString( } JsonObject serviceAccountCredentials = JsonParser.parseString(credentials).getAsJsonObject(); return getBearerTokenFromCredentials(serviceAccountCredentials, context, roles); - } catch (JsonSyntaxException e) { + } catch (JsonSyntaxException | IllegalStateException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_STRING_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.CredentialsStringInvalidJson.getMessage()); @@ -141,17 +141,17 @@ private static V1GetAuthTokenResponse getBearerTokenFromCredentials( throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingTokenUri.getMessage()); } - PrivateKey pvtKey = Utils.getPrivateKeyFromPem(privateKey.getAsString()); + PrivateKey pvtKey = BaseUtils.getPrivateKeyFromPem(privateKey.getAsString()); String signedUserJWT = getSignedToken( clientId.getAsString(), keyId.getAsString(), tokenUri.getAsString(), pvtKey, context ); - String basePath = Utils.getBaseURL(tokenUri.getAsString()); + String basePath = BaseUtils.getBaseURL(tokenUri.getAsString()); API_CLIENT_BUILDER.url(basePath); ApiClient apiClient = API_CLIENT_BUILDER.token("token").build(); AuthenticationClient authenticationApi = apiClient.authentication(); - V1GetAuthTokenRequest._FinalStage authTokenBuilder = V1GetAuthTokenRequest.builder().grantType(Constants.GRANT_TYPE).assertion(signedUserJWT); + V1GetAuthTokenRequest._FinalStage authTokenBuilder = V1GetAuthTokenRequest.builder().grantType(BaseConstants.GRANT_TYPE).assertion(signedUserJWT); if (roles != null) { String scopedRoles = getScopeUsingRoles(roles); diff --git a/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java similarity index 83% rename from src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java rename to common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java index 3d35b541..c4618ae6 100644 --- a/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokenResponse.java @@ -1,10 +1,10 @@ package com.skyflow.serviceaccount.util; import com.google.gson.Gson; -import com.skyflow.utils.Constants; +import com.skyflow.utils.BaseConstants; public class SignedDataTokenResponse { - private static final String PREFIX = Constants.SIGNED_DATA_TOKEN_PREFIX; + private static final String PREFIX = BaseConstants.SIGNED_DATA_TOKEN_PREFIX; private final String token; private final String signedToken; diff --git a/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java similarity index 97% rename from src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java rename to common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java index b909e45b..630a0aee 100644 --- a/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java +++ b/common/src/main/java/com/skyflow/serviceaccount/util/SignedDataTokens.java @@ -9,7 +9,7 @@ import com.skyflow.errors.SkyflowException; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.Utils; +import com.skyflow.utils.BaseUtils; import com.skyflow.utils.logger.LogUtil; import io.jsonwebtoken.Jwts; @@ -18,11 +18,7 @@ import java.io.FileReader; import java.io.IOException; import java.security.PrivateKey; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; public class SignedDataTokens { private final File credentialsFile; @@ -64,11 +60,11 @@ private static List generateSignedTokenFromCredentialsF } } catch (JsonSyntaxException e) { LogUtil.printErrorLog(ErrorLogs.INVALID_CREDENTIALS_FILE_FORMAT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( ErrorMessage.FileInvalidJson.getMessage(), credentialsFile.getPath())); } catch (FileNotFoundException e) { LogUtil.printErrorLog(ErrorLogs.CREDENTIALS_FILE_NOT_FOUND.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), Utils.parameterizedString( + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), BaseUtils.parameterizedString( ErrorMessage.FileNotFound.getMessage(), credentialsFile.getPath())); } return responseToken; @@ -129,7 +125,7 @@ private static List generateSignedTokensFromCredentials LogUtil.printErrorLog(ErrorLogs.KEY_ID_IS_REQUIRED.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MissingKeyId.getMessage()); } - PrivateKey pvtKey = Utils.getPrivateKeyFromPem(privateKey.getAsString()); + PrivateKey pvtKey = BaseUtils.getPrivateKeyFromPem(privateKey.getAsString()); signedDataTokens = getSignedToken( clientId.getAsString(), keyId.getAsString(), pvtKey, dataTokens, timeToLive, context); } catch (RuntimeException e) { diff --git a/src/main/java/com/skyflow/serviceaccount/util/Token.java b/common/src/main/java/com/skyflow/serviceaccount/util/Token.java similarity index 100% rename from src/main/java/com/skyflow/serviceaccount/util/Token.java rename to common/src/main/java/com/skyflow/serviceaccount/util/Token.java diff --git a/common/src/main/java/com/skyflow/utils/BaseConstants.java b/common/src/main/java/com/skyflow/utils/BaseConstants.java new file mode 100644 index 00000000..1f05fe13 --- /dev/null +++ b/common/src/main/java/com/skyflow/utils/BaseConstants.java @@ -0,0 +1,33 @@ +package com.skyflow.utils; + +public class BaseConstants { + public static final String SDK_NAME= "Skyflow Java SDK "; + public static final String SDK_VERSION = "1.0.0"; + public static final String SDK_PREFIX = SDK_NAME + SDK_VERSION; + public static final String ORDER_ASCENDING = "ASCENDING"; + public static final String ENV_CREDENTIALS_KEY_NAME = "SKYFLOW_CREDENTIALS"; + public static final String SECURE_PROTOCOL = "https://"; + + public static final String V2_VAULT_DOMAIN = ".vault."; + public static final String V3_VAULT_DOMAIN = ".skyvault."; + public static final String DEV_DOMAIN = "skyflowapis.dev"; + public static final String STAGE_DOMAIN = "skyflowapis.tech"; + public static final String SANDBOX_DOMAIN = "skyflowapis-preview.com"; + public static final String PROD_DOMAIN = "skyflowapis.com"; + public static final String PKCS8_PRIVATE_HEADER = "-----BEGIN PRIVATE KEY-----"; + public static final String PKCS8_PRIVATE_FOOTER = "-----END PRIVATE KEY-----"; + public static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer"; + public static final String SIGNED_DATA_TOKEN_PREFIX = "signed_token_"; + public static final String API_KEY_REGEX = "^sky-[a-zA-Z0-9]{5}-[a-fA-F0-9]{32}$"; + public static final String CONTEXT_KEY_REGEX = "^[a-zA-Z0-9_]+$"; + public static final String SDK_METRIC_NAME_VERSION = "sdk_name_version"; + public static final String SDK_METRIC_CLIENT_DEVICE_MODEL = "sdk_client_device_model"; + public static final String SDK_METRIC_CLIENT_OS_DETAILS = "sdk_client_os_details"; + public static final String SDK_METRIC_RUNTIME_DETAILS = "sdk_runtime_details"; + public static final String SDK_METRIC_RUNTIME_DETAILS_PREFIX = "Java@"; + public static final String SDK_AUTH_HEADER_KEY = "x-skyflow-authorization"; + public static final String SDK_METRICS_HEADER_KEY = "sky-metadata"; + public static final String REQUEST_ID_HEADER_KEY = "x-request-id"; + public static final String ERROR_FROM_CLIENT_HEADER_KEY = "error-from-client"; + +} diff --git a/src/main/java/com/skyflow/utils/Utils.java b/common/src/main/java/com/skyflow/utils/BaseUtils.java similarity index 63% rename from src/main/java/com/skyflow/utils/Utils.java rename to common/src/main/java/com/skyflow/utils/BaseUtils.java index d116871f..e536c111 100644 --- a/src/main/java/com/skyflow/utils/Utils.java +++ b/common/src/main/java/com/skyflow/utils/BaseUtils.java @@ -1,19 +1,5 @@ package com.skyflow.utils; -import com.google.gson.JsonObject; -import com.skyflow.config.ConnectionConfig; -import com.skyflow.config.Credentials; -import com.skyflow.enums.Env; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.serviceaccount.util.BearerToken; -import com.skyflow.utils.logger.LogUtil; -import com.skyflow.vault.connection.InvokeConnectionRequest; -import java.util.Base64; - import java.io.File; import java.net.MalformedURLException; import java.net.URL; @@ -22,33 +8,22 @@ import java.security.PrivateKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; -import java.util.HashMap; +import java.util.Base64; import java.util.Map; -public final class Utils { - public static String getVaultURL(String clusterId, Env env) { - StringBuilder sb = new StringBuilder(Constants.SECURE_PROTOCOL); - sb.append(clusterId); - switch (env) { - case DEV: - sb.append(Constants.DEV_DOMAIN); - break; - case STAGE: - sb.append(Constants.STAGE_DOMAIN); - break; - case SANDBOX: - sb.append(Constants.SANDBOX_DOMAIN); - break; - case PROD: - default: - sb.append(Constants.PROD_DOMAIN); - break; - } - return sb.toString(); - } +import com.google.gson.JsonObject; +import com.skyflow.config.BaseCredentials; +import com.skyflow.enums.Env; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.serviceaccount.util.BearerToken; +import com.skyflow.utils.logger.LogUtil; - @SuppressWarnings("unchecked") - public static String generateBearerToken(Credentials credentials) throws SkyflowException { +public class BaseUtils { + public static String generateBearerToken(BaseCredentials credentials) throws SkyflowException { if (credentials.getPath() != null) { BearerToken.BearerTokenBuilder builder = BearerToken.builder() .setCredentials(new File(credentials.getPath())) @@ -76,11 +51,29 @@ public static String generateBearerToken(Credentials credentials) throws Skyflow } } + public static String getVaultURL(String clusterId, Env env, String vaultDomain) { + StringBuilder sb = buildBaseUrl(clusterId, vaultDomain); + switch (env) { + case DEV: + sb.append(BaseConstants.DEV_DOMAIN); + break; + case STAGE: + sb.append(BaseConstants.STAGE_DOMAIN); + break; + case SANDBOX: + sb.append(BaseConstants.SANDBOX_DOMAIN); + break; + case PROD: + default: + sb.append(BaseConstants.PROD_DOMAIN); + break; + } + return sb.toString(); + } + public static PrivateKey getPrivateKeyFromPem(String pemKey) throws SkyflowException { - @SuppressWarnings("checkstyle:LocalVariableName") - String PKCS8PrivateHeader = Constants.PKCS8_PRIVATE_HEADER; - @SuppressWarnings("checkstyle:LocalVariableName") - String PKCS8PrivateFooter = Constants.PKCS8_PRIVATE_FOOTER; + String PKCS8PrivateHeader = BaseConstants.PKCS8_PRIVATE_HEADER; + String PKCS8PrivateFooter = BaseConstants.PKCS8_PRIVATE_FOOTER; String privateKeyContent = pemKey; PrivateKey privateKey = null; @@ -88,9 +81,14 @@ public static PrivateKey getPrivateKeyFromPem(String pemKey) throws SkyflowExcep if (pemKey.contains(PKCS8PrivateHeader)) { privateKeyContent = privateKeyContent.replace(PKCS8PrivateHeader, ""); privateKeyContent = privateKeyContent.replace(PKCS8PrivateFooter, ""); - privateKeyContent = privateKeyContent.replace("\n", ""); privateKeyContent = privateKeyContent.replace("\r\n", ""); - privateKey = parsePkcs8PrivateKey(Base64.getDecoder().decode(privateKeyContent)); + privateKeyContent = privateKeyContent.replace("\n", ""); + try { + privateKey = parsePkcs8PrivateKey(Base64.getDecoder().decode(privateKeyContent)); + } catch (IllegalArgumentException e) { + LogUtil.printErrorLog(ErrorLogs.INVALID_KEY_SPEC.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidKeySpec.getMessage()); + } } else { LogUtil.printErrorLog(ErrorLogs.JWT_INVALID_FORMAT.getLog()); throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.JwtInvalidFormat.getMessage()); @@ -112,43 +110,8 @@ public static String parameterizedString(String base, String... args) { return base; } - public static String constructConnectionURL(ConnectionConfig config, InvokeConnectionRequest invokeConnectionRequest) { - StringBuilder filledURL = new StringBuilder(config.getConnectionUrl()); - - if (invokeConnectionRequest.getPathParams() != null && !invokeConnectionRequest.getPathParams().isEmpty()) { - for (Map.Entry entry : invokeConnectionRequest.getPathParams().entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - filledURL = new StringBuilder(filledURL.toString().replace(String.format(Constants.CURLY_PLACEHOLDER, key), value)); - } - } - - if (invokeConnectionRequest.getQueryParams() != null && !invokeConnectionRequest.getQueryParams().isEmpty()) { - filledURL.append("?"); - for (Map.Entry entry : invokeConnectionRequest.getQueryParams().entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - filledURL.append(key).append("=").append(value).append("&"); - } - filledURL = new StringBuilder(filledURL.substring(0, filledURL.length() - 1)); - } - - return filledURL.toString(); - } - - public static Map constructConnectionHeadersMap(Map requestHeaders) { - Map headersMap = new HashMap<>(); - for (Map.Entry entry : requestHeaders.entrySet()) { - String key = entry.getKey(); - String value = entry.getValue(); - headersMap.put(key.toLowerCase(), value); - } - return headersMap; - } - - public static JsonObject getMetrics() { + protected static JsonObject getCommonMetrics() { JsonObject details = new JsonObject(); - String sdkVersion = Constants.SDK_VERSION; String deviceModel; String osDetails; String javaVersion; @@ -159,7 +122,7 @@ public static JsonObject getMetrics() { } catch (Exception e) { LogUtil.printInfoLog(parameterizedString( InfoLogs.UNABLE_TO_GENERATE_SDK_METRIC.getLog(), - Constants.SDK_METRIC_CLIENT_DEVICE_MODEL + BaseConstants.SDK_METRIC_CLIENT_DEVICE_MODEL )); deviceModel = ""; } @@ -171,7 +134,7 @@ public static JsonObject getMetrics() { } catch (Exception e) { LogUtil.printInfoLog(parameterizedString( InfoLogs.UNABLE_TO_GENERATE_SDK_METRIC.getLog(), - Constants.SDK_METRIC_CLIENT_OS_DETAILS + BaseConstants.SDK_METRIC_CLIENT_OS_DETAILS )); osDetails = ""; } @@ -183,14 +146,13 @@ public static JsonObject getMetrics() { } catch (Exception e) { LogUtil.printInfoLog(parameterizedString( InfoLogs.UNABLE_TO_GENERATE_SDK_METRIC.getLog(), - Constants.SDK_METRIC_RUNTIME_DETAILS + BaseConstants.SDK_METRIC_RUNTIME_DETAILS )); javaVersion = ""; } - details.addProperty(Constants.SDK_METRIC_NAME_VERSION, Constants.SDK_METRIC_NAME_VERSION_PREFIX + sdkVersion); - details.addProperty(Constants.SDK_METRIC_CLIENT_DEVICE_MODEL, deviceModel); - details.addProperty(Constants.SDK_METRIC_RUNTIME_DETAILS, Constants.SDK_METRIC_RUNTIME_DETAILS_PREFIX + javaVersion); - details.addProperty(Constants.SDK_METRIC_CLIENT_OS_DETAILS, osDetails); + details.addProperty(BaseConstants.SDK_METRIC_CLIENT_DEVICE_MODEL, deviceModel); + details.addProperty(BaseConstants.SDK_METRIC_RUNTIME_DETAILS, BaseConstants.SDK_METRIC_RUNTIME_DETAILS_PREFIX + javaVersion); + details.addProperty(BaseConstants.SDK_METRIC_CLIENT_OS_DETAILS, osDetails); return details; } @@ -210,4 +172,11 @@ private static PrivateKey parsePkcs8PrivateKey(byte[] pkcs8Bytes) throws Skyflow } return privateKey; } + + private static StringBuilder buildBaseUrl(String clusterId, String vaultDomain) { + StringBuilder sb = new StringBuilder(BaseConstants.SECURE_PROTOCOL); + sb.append(clusterId); + sb.append(vaultDomain); + return sb; + } } diff --git a/common/src/main/java/com/skyflow/utils/SdkVersion.java b/common/src/main/java/com/skyflow/utils/SdkVersion.java new file mode 100644 index 00000000..8136d8c9 --- /dev/null +++ b/common/src/main/java/com/skyflow/utils/SdkVersion.java @@ -0,0 +1,13 @@ +package com.skyflow.utils; + +public class SdkVersion { + private static String sdkPrefix = BaseConstants.SDK_PREFIX; + + public static String getSdkPrefix() { + return sdkPrefix; + } + + public static void setSdkPrefix(String sdkPrefix) { + SdkVersion.sdkPrefix = sdkPrefix; + } +} diff --git a/common/src/main/java/com/skyflow/utils/logger/LogUtil.java b/common/src/main/java/com/skyflow/utils/logger/LogUtil.java new file mode 100644 index 00000000..ed2b7671 --- /dev/null +++ b/common/src/main/java/com/skyflow/utils/logger/LogUtil.java @@ -0,0 +1,103 @@ +package com.skyflow.utils.logger; + +import com.skyflow.enums.LogLevel; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.SdkVersion; + +import java.util.logging.*; + +public final class LogUtil { + private static final Logger LOGGER = Logger.getLogger(LogUtil.class.getName()); + private static boolean IS_LOGGER_SETUP_DONE = false; + + private static String logPrefix() { + return "[" + SdkVersion.getSdkPrefix() + "] "; + } + + synchronized public static void setupLogger(LogLevel logLevel) { + IS_LOGGER_SETUP_DONE = true; + LogManager.getLogManager().reset(); + LOGGER.setUseParentHandlers(false); + Formatter formatter = new SimpleFormatter() { + private static final String format = "%s: %s %n"; + + // Override format method + @Override + public synchronized String format(LogRecord logRecord) { + return String.format( + format, + loggerLevelToLogLevelMap(logRecord.getLevel()), + logRecord.getMessage() + ); + } + }; + ConsoleHandler consoleHandler = new ConsoleHandler(); + consoleHandler.setFormatter(formatter); + consoleHandler.setLevel(Level.CONFIG); + + LOGGER.addHandler(consoleHandler); + LOGGER.setLevel(logLevelToLoggerLevelMap(logLevel)); + printInfoLog(InfoLogs.LOGGER_SETUP_DONE.getLog()); + } + + public static void printErrorLog(String message) { + if (IS_LOGGER_SETUP_DONE) + LOGGER.severe(logPrefix() + message); + else { + setupLogger(LogLevel.ERROR); + LOGGER.severe(logPrefix() + message); + } + } + + public static void printDebugLog(String message) { + if (IS_LOGGER_SETUP_DONE) + LOGGER.config(logPrefix() + message); + } + + public static void printWarningLog(String message) { + if (IS_LOGGER_SETUP_DONE) + LOGGER.warning(logPrefix() + message); + } + + public static void printInfoLog(String message) { + if (IS_LOGGER_SETUP_DONE) + LOGGER.info(logPrefix() + message); + } + + + private static Level logLevelToLoggerLevelMap(LogLevel logLevel) { + Level loggerLevel; + switch (logLevel) { + case ERROR: + loggerLevel = Level.SEVERE; + break; + case WARN: + loggerLevel = Level.WARNING; + break; + case INFO: + loggerLevel = Level.INFO; + break; + case DEBUG: + loggerLevel = Level.CONFIG; + break; + default: + loggerLevel = Level.OFF; + } + return loggerLevel; + } + + private static LogLevel loggerLevelToLogLevelMap(Level loggerLevel) { + LogLevel logLevel; + if (Level.SEVERE.equals(loggerLevel)) { + logLevel = LogLevel.ERROR; + } else if (Level.WARNING.equals(loggerLevel)) { + logLevel = LogLevel.WARN; + } else if (Level.INFO.equals(loggerLevel)) { + logLevel = LogLevel.INFO; + } else if (Level.CONFIG.equals(loggerLevel)) { + logLevel = LogLevel.DEBUG; + } else + logLevel = LogLevel.OFF; + return logLevel; + } +} diff --git a/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java b/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java new file mode 100644 index 00000000..c2ee2df9 --- /dev/null +++ b/common/src/main/java/com/skyflow/utils/validations/BaseValidations.java @@ -0,0 +1,111 @@ +package com.skyflow.utils.validations; + +import com.skyflow.config.BaseCredentials; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.BaseUtils; +import com.skyflow.utils.logger.LogUtil; + +import java.util.ArrayList; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class BaseValidations { + BaseValidations() { + } + + public static void validateCredentials(BaseCredentials credentials) throws SkyflowException { + int nonNullMembers = 0; + String path = credentials.getPath(); + String credentialsString = credentials.getCredentialsString(); + String token = credentials.getToken(); + String apiKey = credentials.getApiKey(); + Object context = credentials.getContext(); + ArrayList roles = credentials.getRoles(); + + if (path != null) nonNullMembers++; + if (credentialsString != null) nonNullMembers++; + if (token != null) nonNullMembers++; + if (apiKey != null) nonNullMembers++; + + if (nonNullMembers > 1) { + LogUtil.printErrorLog(ErrorLogs.MULTIPLE_TOKEN_GENERATION_MEANS_PASSED.getLog()); + throw new SkyflowException( + ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() + ); + } else if (nonNullMembers < 1) { + LogUtil.printErrorLog(ErrorLogs.NO_TOKEN_GENERATION_MEANS_PASSED.getLog()); + throw new SkyflowException( + ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NoTokenGenerationMeansPassed.getMessage() + ); + } else if (path != null && path.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_PATH.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialFilePath.getMessage()); + } else if (credentialsString != null && credentialsString.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_STRING.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialsString.getMessage()); + } else if (token != null && token.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_TOKEN_VALUE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyToken.getMessage()); + } else if (apiKey != null) { + if (apiKey.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_API_KEY_VALUE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyApikey.getMessage()); + } else { + Pattern pattern = Pattern.compile(BaseConstants.API_KEY_REGEX); + Matcher matcher = pattern.matcher(apiKey); + if (!matcher.matches()) { + LogUtil.printErrorLog(ErrorLogs.INVALID_API_KEY.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidApikey.getMessage()); + } + } + } else if (roles != null) { + if (roles.isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_ROLES.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoles.getMessage()); + } else { + for (int index = 0; index < roles.size(); index++) { + String role = roles.get(index); + if (role == null || role.trim().isEmpty()) { + LogUtil.printErrorLog(BaseUtils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_ROLE_IN_ROLES.getLog(), Integer.toString(index) + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoleInRoles.getMessage()); + } + } + } + } + if (context != null) { + if (context instanceof String) { + String ctxStr = (String) context; + if (ctxStr.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + } + } else if (context instanceof Map) { + Map ctxMap = (Map) context; + if (ctxMap.isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + } + Pattern ctxKeyPattern = Pattern.compile(BaseConstants.CONTEXT_KEY_REGEX); + for (Object key : ctxMap.keySet()) { + if (key == null || !ctxKeyPattern.matcher(key.toString()).matches()) { + String keyStr = key == null ? "null" : key.toString(); + LogUtil.printErrorLog(BaseUtils.parameterizedString( + ErrorLogs.INVALID_CONTEXT_MAP_KEY.getLog(), keyStr)); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + BaseUtils.parameterizedString(ErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); + } + } + } else { + LogUtil.printErrorLog(ErrorLogs.INVALID_CONTEXT_TYPE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidContextType.getMessage()); + } + } + } +} diff --git a/common/src/main/java/com/skyflow/vault/controller/IVaultController.java b/common/src/main/java/com/skyflow/vault/controller/IVaultController.java new file mode 100644 index 00000000..1c4f907f --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/controller/IVaultController.java @@ -0,0 +1,9 @@ +package com.skyflow.vault.controller; + +import com.skyflow.errors.SkyflowException; + +// Common interface — ONLY operations supported on both vault types. +public interface IVaultController { + InsertResp insert(InsertReq request) throws SkyflowException; + DetokenizeResp detokenize(DetokenizeReq request) throws SkyflowException; +} \ No newline at end of file diff --git a/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeData.java b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeData.java new file mode 100644 index 00000000..0da23763 --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeData.java @@ -0,0 +1,14 @@ +package com.skyflow.vault.data; + +public class BaseDetokenizeData { + private final String token; + + public BaseDetokenizeData(String token) { + this.token = token; + } + + public String getToken() { + return this.token; + } + +} diff --git a/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRecordResponse.java b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRecordResponse.java new file mode 100644 index 00000000..7a1ec217 --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRecordResponse.java @@ -0,0 +1,19 @@ +package com.skyflow.vault.data; + +public class BaseDetokenizeRecordResponse { + private final String token; + private final String error; + + public BaseDetokenizeRecordResponse(String token, String error){ + this.token = token; + this.error = error; + } + public String getToken() { + return token; + } + + public String getError() { + return error; + } + +} diff --git a/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRequest.java b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRequest.java new file mode 100644 index 00000000..d19d0432 --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeRequest.java @@ -0,0 +1,4 @@ +package com.skyflow.vault.data; + +public class BaseDetokenizeRequest { +} diff --git a/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeResponse.java b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeResponse.java new file mode 100644 index 00000000..a5061b25 --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/BaseDetokenizeResponse.java @@ -0,0 +1,5 @@ +package com.skyflow.vault.data; + +public class BaseDetokenizeResponse { + +} diff --git a/common/src/main/java/com/skyflow/vault/data/BaseInsertRequest.java b/common/src/main/java/com/skyflow/vault/data/BaseInsertRequest.java new file mode 100644 index 00000000..d2f6f812 --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/BaseInsertRequest.java @@ -0,0 +1,25 @@ +package com.skyflow.vault.data; + +class BaseInsertRequest { + private final BaseInsertRequestBuilder builder; + + protected BaseInsertRequest(BaseInsertRequestBuilder builder) { + this.builder = builder; + } + + public String getTable() { + return this.builder.table; + } + + static class BaseInsertRequestBuilder { + protected String table; + protected BaseInsertRequestBuilder() { + } + + public BaseInsertRequestBuilder table(String table) { + this.table = table; + return this; + } + + } +} diff --git a/src/main/java/com/skyflow/vault/data/InsertResponse.java b/common/src/main/java/com/skyflow/vault/data/BaseInsertResponse.java similarity index 80% rename from src/main/java/com/skyflow/vault/data/InsertResponse.java rename to common/src/main/java/com/skyflow/vault/data/BaseInsertResponse.java index 3d311525..84196bf7 100644 --- a/src/main/java/com/skyflow/vault/data/InsertResponse.java +++ b/common/src/main/java/com/skyflow/vault/data/BaseInsertResponse.java @@ -5,11 +5,11 @@ import java.util.ArrayList; import java.util.HashMap; -public class InsertResponse { +public class BaseInsertResponse { private final ArrayList> insertedFields; private final ArrayList> errors; - public InsertResponse(ArrayList> insertedFields, ArrayList> errors) { + public BaseInsertResponse(ArrayList> insertedFields, ArrayList> errors) { this.insertedFields = insertedFields; this.errors = errors; } @@ -28,3 +28,4 @@ public String toString() { return gson.toJson(this); } } + diff --git a/common/src/main/java/com/skyflow/vault/data/RequestContext.java b/common/src/main/java/com/skyflow/vault/data/RequestContext.java new file mode 100644 index 00000000..0cf6055b --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/RequestContext.java @@ -0,0 +1,26 @@ +package com.skyflow.vault.data; + +import com.skyflow.enums.CustomHeaderKey; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public final class RequestContext { + private final String operation; + private final Map headers = new HashMap<>(); + + public RequestContext(String operation) { + this.operation = operation; + } + + public String getOperation() { return operation; } + + public void addHeader(CustomHeaderKey key, String value) { + headers.put(key, value); + } + + public Map getHeaders() { + return Collections.unmodifiableMap(headers); + } +} diff --git a/common/src/main/java/com/skyflow/vault/data/RequestInterceptor.java b/common/src/main/java/com/skyflow/vault/data/RequestInterceptor.java new file mode 100644 index 00000000..37f5261d --- /dev/null +++ b/common/src/main/java/com/skyflow/vault/data/RequestInterceptor.java @@ -0,0 +1,6 @@ +package com.skyflow.vault.data; + +@FunctionalInterface +public interface RequestInterceptor { + void intercept(RequestContext context); +} diff --git a/common/src/test/java/com/skyflow/BaseSkyflowTests.java b/common/src/test/java/com/skyflow/BaseSkyflowTests.java new file mode 100644 index 00000000..2e18a1ea --- /dev/null +++ b/common/src/test/java/com/skyflow/BaseSkyflowTests.java @@ -0,0 +1,360 @@ +package com.skyflow; + +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.config.Credentials; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class BaseSkyflowTests { + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; + private static String vaultID = null; + private static String clusterID = null; + private static String newClusterID = null; + private static String token = null; + + @BeforeClass + public static void setup() { + vaultID = "test_vault_id"; + clusterID = "test_cluster_id"; + newClusterID = "new_test_cluster_id"; + token = "test_token"; + } + + private static BaseVaultConfig newConfig(String vaultId, String clusterId, Env env) { + BaseVaultConfig config = new BaseVaultConfig(); + config.setVaultId(vaultId); + config.setClusterId(clusterId); + config.setEnv(env); + return config; + } + + @Test + public void testAddingExistingVaultConfigThrows() { + try { + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + TestSkyflow client = TestSkyflow.builder().build(); + client.addVaultConfig(config).addVaultConfig(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdAlreadyInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testUpdatingNonExistentVaultConfigInBuilderThrows() { + try { + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + TestSkyflow.builder().updateVaultConfig(config).build(); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testUpdatingNonExistentVaultConfigInClientThrows() { + try { + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + TestSkyflow client = TestSkyflow.builder().build(); + client.updateVaultConfig(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testRemovingNonExistentVaultConfigInBuilderThrows() { + try { + TestSkyflow.builder().removeVaultConfig(vaultID).build(); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testRemovingExistingVaultConfigSucceeds() { + try { + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(config).build(); + client.removeVaultConfig(vaultID); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testRemovingVaultConfigWithoutAddingThrows() { + try { + TestSkyflow client = TestSkyflow.builder().build(); + client.removeVaultConfig(vaultID); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testGettingNonExistentVaultConfigReturnsNull() { + TestSkyflow client = TestSkyflow.builder().build(); + Assert.assertNull(client.getVaultConfig(vaultID)); + } + + @Test + public void testVaultThrowsWhenNoConfigAdded() { + try { + TestSkyflow client = TestSkyflow.builder().build(); + client.vault(); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testVaultByIdThrowsAfterRemoval() { + try { + BaseVaultConfig primary = newConfig(vaultID, clusterID, Env.SANDBOX); + BaseVaultConfig secondary = newConfig(vaultID + "123", clusterID, Env.SANDBOX); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(primary).addVaultConfig(secondary).build(); + client.removeVaultConfig(vaultID); + client.vault(vaultID); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); + } + } + + @Test + public void testDefaultLogLevel() { + TestSkyflow client = TestSkyflow.builder().setLogLevel(null).build(); + Assert.assertEquals(LogLevel.ERROR, client.getLogLevel()); + } + + @Test + public void testSetLogLevel() { + TestSkyflow client = TestSkyflow.builder().setLogLevel(LogLevel.INFO).build(); + Assert.assertEquals(LogLevel.INFO, client.getLogLevel()); + client.setLogLevel(LogLevel.WARN); + Assert.assertEquals(LogLevel.WARN, client.getLogLevel()); + } + + @Test + public void testAddingInvalidSkyflowCredentialsThrows() { + try { + Credentials credentials = new Credentials(); + TestSkyflow.builder().addSkyflowCredentials(credentials).build(); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); + } + } + + @Test + public void testUpdatingValidSkyflowCredentialsSucceeds() { + try { + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + Credentials credentials = new Credentials(); + credentials.setToken(token); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(config).build(); + client.updateSkyflowCredentials(credentials); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testUpdateVaultConfigNullCredentialsFallsBackToPrevious() { + try { + Credentials creds = new Credentials(); + creds.setToken(token); + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.SANDBOX); + config.setCredentials(creds); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(config).build(); + + BaseVaultConfig partialUpdate = newConfig(vaultID, clusterID, Env.SANDBOX); + client.updateVaultConfig(partialUpdate); + Assert.assertNotNull(client.getVaultConfig(vaultID).getCredentials()); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testUpdateVaultConfigWithNewClusterIdAndCredentialsUpdatesAllFields() { + try { + Credentials creds = new Credentials(); + creds.setToken(token); + BaseVaultConfig config = newConfig(vaultID, clusterID, Env.DEV); + config.setCredentials(creds); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(config).build(); + + Credentials newCreds = new Credentials(); + newCreds.setToken("updated-token-value"); + BaseVaultConfig update = newConfig(vaultID, newClusterID, Env.PROD); + update.setCredentials(newCreds); + client.updateVaultConfig(update); + + Assert.assertEquals(newClusterID, client.getVaultConfig(vaultID).getClusterId()); + Assert.assertEquals(Env.PROD, client.getVaultConfig(vaultID).getEnv()); + Assert.assertEquals("updated-token-value", client.getVaultConfig(vaultID).getCredentials().getToken()); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testUpdateVaultConfigWithNullEnvFallsBackToPreviousEnv() { + // BaseVaultConfig's setEnv/constructor never store null (default to PROD), so getEnv() + // never returns null via the normal API. Override it to exercise the fallback branch + // in mergeVaultConfig. + try { + Credentials creds = new Credentials(); + creds.setToken(token); + BaseVaultConfig initial = newConfig(vaultID, clusterID, Env.SANDBOX); + initial.setCredentials(creds); + TestSkyflow client = TestSkyflow.builder().addVaultConfig(initial).build(); + + BaseVaultConfig updateWithNullEnv = new BaseVaultConfig() { + @Override + public Env getEnv() { + return null; + } + }; + updateWithNullEnv.setVaultId(vaultID); + updateWithNullEnv.setClusterId(clusterID); + updateWithNullEnv.setCredentials(creds); + + client.updateVaultConfig(updateWithNullEnv); + Assert.assertEquals(Env.SANDBOX, client.getVaultConfig(vaultID).getEnv()); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testMergeVaultConfigWithNullClusterIdFallsBackToPreviousClusterId() throws SkyflowException { + BaseVaultConfig existing = newConfig(vaultID, clusterID, Env.DEV); + BaseVaultConfig incoming = new BaseVaultConfig(); + incoming.setVaultId(vaultID); + // clusterId intentionally left null + + BaseVaultConfig result = TestSkyflow.builder().mergeVaultConfig(incoming, existing); + Assert.assertEquals(clusterID, result.getClusterId()); + } + + private static class TestSkyflow extends BaseSkyflow { + private final TestSkyflowClientBuilder builder; + + private TestSkyflow(TestSkyflowClientBuilder builder) { + super(builder); + this.builder = builder; + } + + static TestSkyflowClientBuilder builder() { + return new TestSkyflowClientBuilder(); + } + + @Override + protected TestSkyflow self() { + return this; + } + + Object vault() throws SkyflowException { + return resolveOrThrow(this.builder.vaultClientsMap, null, + ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + Object vault(String vaultId) throws SkyflowException { + return resolveOrThrow(this.builder.vaultClientsMap, vaultId, + ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + private static class TestSkyflowClientBuilder extends BaseSkyflowClientBuilder { + private final java.util.LinkedHashMap vaultClientsMap = new java.util.LinkedHashMap<>(); + + @Override + protected void validateVaultConfig(BaseVaultConfig vaultConfig) throws SkyflowException { + if (vaultConfig.getVaultId() == null || vaultConfig.getVaultId().trim().isEmpty()) { + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyVaultId.getMessage()); + } + } + + @Override + protected void onVaultConfigAdded(BaseVaultConfig vaultConfig) { + this.vaultClientsMap.put(vaultConfig.getVaultId(), new Object()); + } + + @Override + protected void onVaultConfigUpdated(BaseVaultConfig updatedConfig) { + this.vaultClientsMap.put(updatedConfig.getVaultId(), new Object()); + } + + @Override + protected void onVaultConfigRemoved(String vaultId) { + this.vaultClientsMap.remove(vaultId); + } + + @Override + protected boolean hasVaultClient(String vaultId) { + return this.vaultClientsMap.containsKey(vaultId); + } + + @Override + protected void onCredentialsUpdated(Credentials credentials) { + // no-op: this test double only exercises template orchestration, not propagation + } + + @Override + public TestSkyflowClientBuilder addVaultConfig(BaseVaultConfig vaultConfig) throws SkyflowException { + super.addVaultConfig(vaultConfig); + return this; + } + + @Override + public TestSkyflowClientBuilder updateVaultConfig(BaseVaultConfig vaultConfig) throws SkyflowException { + super.updateVaultConfig(vaultConfig); + return this; + } + + @Override + public TestSkyflowClientBuilder removeVaultConfig(String vaultId) throws SkyflowException { + super.removeVaultConfig(vaultId); + return this; + } + + @Override + public TestSkyflowClientBuilder addSkyflowCredentials(Credentials credentials) throws SkyflowException { + super.addSkyflowCredentials(credentials); + return this; + } + + @Override + public TestSkyflowClientBuilder setLogLevel(LogLevel logLevel) { + super.setLogLevel(logLevel); + return this; + } + + TestSkyflow build() { + return new TestSkyflow(this); + } + } + } +} diff --git a/common/src/test/java/com/skyflow/BaseVaultClientTests.java b/common/src/test/java/com/skyflow/BaseVaultClientTests.java new file mode 100644 index 00000000..c8c128f2 --- /dev/null +++ b/common/src/test/java/com/skyflow/BaseVaultClientTests.java @@ -0,0 +1,166 @@ +package com.skyflow; + +import com.skyflow.config.BaseCredentials; +import com.skyflow.config.BaseVaultConfig; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.utils.BaseConstants; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class BaseVaultClientTests { + + private static final String ENV_FILE = ".env"; + private byte[] originalEnvContent; + + @Before + public void saveEnvFileState() throws IOException { + File f = new File(ENV_FILE); + originalEnvContent = f.exists() ? Files.readAllBytes(Paths.get(ENV_FILE)) : null; + } + + @After + public void restoreEnvFile() throws IOException { + if (originalEnvContent != null) { + Files.write(Paths.get(ENV_FILE), originalEnvContent); + } else { + Files.deleteIfExists(Paths.get(ENV_FILE)); + } + } + + private BaseVaultClient newClient(BaseCredentials commonCredentials) { + return new BaseVaultClient<>(new BaseVaultConfig(), commonCredentials); + } + + @Test + public void testPrioritiseCredentials_prefersVaultSpecificCredentials() throws SkyflowException { + BaseCredentials vaultSpecific = new BaseCredentials(); + vaultSpecific.setApiKey("test_api_key"); + BaseVaultClient client = newClient(null); + + client.prioritiseCredentials(vaultSpecific); + + Assert.assertEquals(vaultSpecific, client.finalCredentials); + } + + @Test + public void testPrioritiseCredentials_fallsBackToCommonCredentials() throws SkyflowException { + BaseCredentials common = new BaseCredentials(); + common.setApiKey("common_api_key"); + BaseVaultClient client = newClient(common); + + client.prioritiseCredentials(null); + + Assert.assertEquals(common, client.finalCredentials); + } + + @Test + public void testPrioritiseCredentials_credentialChange_resetsTokenAndApiKey() throws SkyflowException { + BaseCredentials credentialsA = new BaseCredentials(); + credentialsA.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); + BaseVaultClient client = newClient(null); + + client.prioritiseCredentials(credentialsA); + client.token = "cached-token"; + client.apiKey = "cached-api-key"; + + BaseCredentials credentialsB = new BaseCredentials(); + credentialsB.setToken("other-token"); + client.prioritiseCredentials(credentialsB); + + Assert.assertNull(client.token); + Assert.assertNull(client.apiKey); + } + + @Test + public void testSetBearerToken_withApiKey() throws SkyflowException { + BaseCredentials creds = new BaseCredentials(); + creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + BaseVaultClient client = newClient(null); + + client.setBearerToken(creds); + + Assert.assertEquals("sky-ab123-abcd1234cdef1234abcd4321cdef4321", client.token); + } + + @Test + public void testSetBearerToken_generatesTokenWhenNull() throws SkyflowException { + BaseCredentials creds = new BaseCredentials(); + creds.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); + BaseVaultClient client = newClient(null); + + client.setBearerToken(creds); + + Assert.assertEquals("x.eyJleHAiOjk5OTk5OTk5OTl9.y", client.token); + } + + @Test + public void testSetBearerToken_reusesValidNonExpiredToken() throws SkyflowException { + BaseCredentials creds = new BaseCredentials(); + creds.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); + BaseVaultClient client = newClient(null); + + // First call: token=null → generates from creds.getToken() + client.setBearerToken(creds); + Assert.assertEquals("x.eyJleHAiOjk5OTk5OTk5OTl9.y", client.token); + + // Second call: token valid, not expired → reuse branch + client.setBearerToken(creds); + Assert.assertEquals("x.eyJleHAiOjk5OTk5OTk5OTl9.y", client.token); + } + + @Test + public void testSetBearerToken_noCredentials_throwsEmptyCredentials() { + BaseVaultClient client = newClient(null); + try { + client.setBearerToken(null); + Assert.fail("Should have thrown SkyflowException"); + } catch (SkyflowException e) { + // message varies by environment (EmptyCredentials when no .env, or credential error when .env provides creds) + } + } + + /** + * Covers the dotenv success path: Dotenv.load() succeeds and returns a + * non-null credentials string, so finalCredentials is set via credentialsString. + */ + @Test + public void testPrioritiseCredentials_dotenvReturnsCredentials_setsCredentials() throws Exception { + try (FileWriter fw = new FileWriter(ENV_FILE)) { + fw.write(BaseConstants.ENV_CREDENTIALS_KEY_NAME + "={\"token\":\"env-token-value\"}\n"); + } + + BaseVaultClient client = newClient(null); + client.prioritiseCredentials(null); + + Assert.assertNotNull(client.finalCredentials); + Assert.assertEquals("{\"token\":\"env-token-value\"}", client.finalCredentials.getCredentialsString()); + } + + /** + * Covers the path where dotenv loads but the key is absent (returns null), + * causing SkyflowException(EmptyCredentials) to be thrown directly. + */ + @Test + public void testPrioritiseCredentials_dotenvKeyMissing_throwsSkyflowException() throws Exception { + try (FileWriter fw = new FileWriter(ENV_FILE)) { + fw.write("SOME_OTHER_KEY=some_value\n"); + } + + BaseVaultClient client = newClient(null); + try { + client.prioritiseCredentials(null); + Assert.fail("Should have thrown SkyflowException"); + } catch (SkyflowException e) { + Assert.assertTrue(e.getMessage().contains(ErrorMessage.EmptyCredentials.getMessage())); + } + } +} diff --git a/common/src/test/java/com/skyflow/config/BaseVaultConfigTests.java b/common/src/test/java/com/skyflow/config/BaseVaultConfigTests.java new file mode 100644 index 00000000..bea158b5 --- /dev/null +++ b/common/src/test/java/com/skyflow/config/BaseVaultConfigTests.java @@ -0,0 +1,75 @@ +package com.skyflow.config; + +import com.skyflow.enums.Env; +import org.junit.Assert; +import org.junit.Test; + +public class BaseVaultConfigTests { + + @Test + public void testDefaultConstructorDefaults() { + BaseVaultConfig config = new BaseVaultConfig(); + Assert.assertNull(config.getVaultId()); + Assert.assertNull(config.getClusterId()); + Assert.assertEquals(Env.PROD, config.getEnv()); + Assert.assertNull(config.getCredentials()); + } + + @Test + public void testGettersAndSetters() { + BaseVaultConfig config = new BaseVaultConfig(); + Credentials credentials = new Credentials(); + credentials.setToken("test_token"); + + config.setVaultId("vault_id"); + config.setClusterId("cluster_id"); + config.setEnv(Env.SANDBOX); + config.setCredentials(credentials); + + Assert.assertEquals("vault_id", config.getVaultId()); + Assert.assertEquals("cluster_id", config.getClusterId()); + Assert.assertEquals(Env.SANDBOX, config.getEnv()); + Assert.assertEquals(credentials, config.getCredentials()); + } + + @Test + public void testSetEnvNullFallsBackToProd() { + BaseVaultConfig config = new BaseVaultConfig(); + config.setEnv(Env.DEV); + config.setEnv(null); + Assert.assertEquals(Env.PROD, config.getEnv()); + } + + @Test + public void testCloneProducesIndependentCopy() throws CloneNotSupportedException { + BaseVaultConfig original = new BaseVaultConfig(); + original.setVaultId("vault_id"); + original.setClusterId("cluster_id"); + original.setEnv(Env.STAGE); + Credentials credentials = new Credentials(); + credentials.setToken("original_token"); + original.setCredentials(credentials); + + BaseVaultConfig cloned = (BaseVaultConfig) original.clone(); + + Assert.assertNotSame(original, cloned); + Assert.assertEquals(original.getVaultId(), cloned.getVaultId()); + Assert.assertEquals(original.getClusterId(), cloned.getClusterId()); + Assert.assertEquals(original.getEnv(), cloned.getEnv()); + Assert.assertNotSame(original.getCredentials(), cloned.getCredentials()); + Assert.assertEquals("original_token", cloned.getCredentials().getToken()); + + // Mutating the clone's credentials must not affect the original + cloned.getCredentials().setToken("mutated_token"); + Assert.assertEquals("original_token", original.getCredentials().getToken()); + } + + @Test + public void testCloneWithNullCredentials() throws CloneNotSupportedException { + BaseVaultConfig original = new BaseVaultConfig(); + original.setVaultId("vault_id"); + + BaseVaultConfig cloned = (BaseVaultConfig) original.clone(); + Assert.assertNull(cloned.getCredentials()); + } +} diff --git a/src/test/java/com/skyflow/config/CredentialsTests.java b/common/src/test/java/com/skyflow/config/CredentialsTests.java similarity index 89% rename from src/test/java/com/skyflow/config/CredentialsTests.java rename to common/src/test/java/com/skyflow/config/CredentialsTests.java index a9a9153f..cdf7fc3f 100644 --- a/src/test/java/com/skyflow/config/CredentialsTests.java +++ b/common/src/test/java/com/skyflow/config/CredentialsTests.java @@ -3,7 +3,7 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.validations.Validations; +import com.skyflow.utils.validations.BaseValidations; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -13,8 +13,6 @@ import java.util.HashMap; import java.util.Map; -import com.skyflow.utils.Utils; - public class CredentialsTests { private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; @@ -49,7 +47,7 @@ public void testValidCredentialsWithPath() { try { Credentials credentials = new Credentials(); credentials.setPath(path); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.assertNull(credentials.getCredentialsString()); Assert.assertNull(credentials.getToken()); Assert.assertNull(credentials.getApiKey()); @@ -63,7 +61,7 @@ public void testValidCredentialsWithCredentialsString() { try { Credentials credentials = new Credentials(); credentials.setCredentialsString(credentialsString); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.assertNull(credentials.getPath()); Assert.assertNull(credentials.getToken()); Assert.assertNull(credentials.getApiKey()); @@ -77,7 +75,7 @@ public void testValidCredentialsWithToken() { try { Credentials credentials = new Credentials(); credentials.setToken(token); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.assertNull(credentials.getPath()); Assert.assertNull(credentials.getCredentialsString()); Assert.assertNull(credentials.getApiKey()); @@ -91,7 +89,7 @@ public void testValidCredentialsWithApikey() { try { Credentials credentials = new Credentials(); credentials.setApiKey(validApiKey); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.assertNull(credentials.getPath()); Assert.assertNull(credentials.getCredentialsString()); Assert.assertNull(credentials.getToken()); @@ -108,7 +106,7 @@ public void testValidCredentialsWithRolesAndContext() { credentials.setApiKey(validApiKey); credentials.setRoles(roles); credentials.setContext(context); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.assertNull(credentials.getPath()); Assert.assertNull(credentials.getCredentialsString()); Assert.assertNull(credentials.getToken()); @@ -124,7 +122,7 @@ public void testEmptyPathInCredentials() { try { Credentials credentials = new Credentials(); credentials.setPath(""); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -137,7 +135,7 @@ public void testEmptyCredentialsStringInCredentials() { try { Credentials credentials = new Credentials(); credentials.setCredentialsString(""); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -150,7 +148,7 @@ public void testEmptyTokenInCredentials() { try { Credentials credentials = new Credentials(); credentials.setToken(""); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -163,7 +161,7 @@ public void testEmptyApikeyInCredentials() { try { Credentials credentials = new Credentials(); credentials.setApiKey(""); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -176,7 +174,7 @@ public void testInvalidApikeyInCredentials() { try { Credentials credentials = new Credentials(); credentials.setApiKey(invalidApiKey); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -190,7 +188,7 @@ public void testBothTokenAndPathInCredentials() { Credentials credentials = new Credentials(); credentials.setPath(path); credentials.setToken(token); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -202,7 +200,7 @@ public void testBothTokenAndPathInCredentials() { public void testNothingPassedInCredentials() { try { Credentials credentials = new Credentials(); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -216,7 +214,7 @@ public void testEmptyRolesInCredentials() { Credentials credentials = new Credentials(); credentials.setPath(path); credentials.setRoles(roles); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -232,7 +230,7 @@ public void testNullRoleInRolesInCredentials() { roles.add(role); roles.add(null); credentials.setRoles(roles); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -248,7 +246,7 @@ public void testEmptyRoleInRolesInCredentials() { roles.add(role); roles.add(""); credentials.setRoles(roles); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -262,7 +260,7 @@ public void testEmptyContextInCredentials() { Credentials credentials = new Credentials(); credentials.setPath(path); credentials.setContext(""); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -280,7 +278,7 @@ public void testValidMapContextInCredentials() { ctxMap.put("department", "finance"); ctxMap.put("user_id", "user_12345"); credentials.setContext(ctxMap); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); } catch (SkyflowException e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -293,7 +291,7 @@ public void testEmptyMapContextInCredentials() { credentials.setPath(path); Map ctxMap = new HashMap<>(); credentials.setContext(ctxMap); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -310,7 +308,7 @@ public void testInvalidMapKeyInContextCredentials() { ctxMap.put("valid_key", "value"); ctxMap.put("invalid-key", "value"); credentials.setContext(ctxMap); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); @@ -329,7 +327,7 @@ public void testMapContextWithNestedObjects() { ctxMap.put("role", "admin"); ctxMap.put("metadata", nested); credentials.setContext(ctxMap); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); } catch (SkyflowException e) { Assert.fail(INVALID_EXCEPTION_THROWN); } @@ -346,7 +344,7 @@ public void testMapContextWithMixedValueTypes() { ctxMap.put("active", true); ctxMap.put("timestamp", "2025-12-25T10:30:00Z"); credentials.setContext(ctxMap); - Validations.validateCredentials(credentials); + BaseValidations.validateCredentials(credentials); } catch (SkyflowException e) { Assert.fail(INVALID_EXCEPTION_THROWN); } diff --git a/src/test/java/com/skyflow/errors/SkyflowExceptionTest.java b/common/src/test/java/com/skyflow/errors/SkyflowExceptionTest.java similarity index 100% rename from src/test/java/com/skyflow/errors/SkyflowExceptionTest.java rename to common/src/test/java/com/skyflow/errors/SkyflowExceptionTest.java diff --git a/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java similarity index 95% rename from src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java rename to common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java index 3aeca811..bc8f09b5 100644 --- a/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/BearerTokenTests.java @@ -3,8 +3,8 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.Constants; -import com.skyflow.utils.Utils; +import com.skyflow.utils.BaseConstants; +import com.skyflow.utils.BaseUtils; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -92,7 +92,7 @@ public void testEmptyCredentialsFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage() + BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage() ); } } @@ -107,7 +107,7 @@ public void testInvalidFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), + BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), e.getMessage() ); } @@ -123,7 +123,7 @@ public void testInvalidCredentialsFile() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), e.getMessage() ); } @@ -264,7 +264,7 @@ public void testBearerTokenWithNewFormCredentialKeys() { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); // InvalidKeySpec confirms all credential fields were resolved — failure is at RSA parsing, not field lookup Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidKeySpec.getMessage(), Constants.SDK_PREFIX), + BaseUtils.parameterizedString(ErrorMessage.InvalidKeySpec.getMessage(), BaseConstants.SDK_PREFIX), e.getMessage()); } } diff --git a/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java similarity index 94% rename from src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java rename to common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java index 93d69b0e..1465c2ca 100644 --- a/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/SignedDataTokensTests.java @@ -3,7 +3,7 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.Utils; +import com.skyflow.utils.BaseUtils; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -85,7 +85,7 @@ public void testEmptyCredentialsFilePath() { Assert.fail(EXCEPTION_NOT_THROWN); } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(Utils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage()); + Assert.assertEquals(BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), ""), e.getMessage()); } } @@ -99,7 +99,7 @@ public void testInvalidFilePath() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), + BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), invalidFilePath), e.getMessage()); } } @@ -114,7 +114,7 @@ public void testInvalidCredentialsFile() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(ErrorMessage.FileInvalidJson.getMessage(), invalidJsonFilePath), e.getMessage() ); } @@ -129,7 +129,7 @@ public void testEmptyCredentialsString() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.InvalidCredentials.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(ErrorMessage.InvalidCredentials.getMessage(), invalidJsonFilePath), e.getMessage() ); } catch (Exception e) { @@ -146,7 +146,7 @@ public void testInvalidCredentialsString() { } catch (SkyflowException e) { Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.CredentialsStringInvalidJson.getMessage(), invalidJsonFilePath), + BaseUtils.parameterizedString(ErrorMessage.CredentialsStringInvalidJson.getMessage(), invalidJsonFilePath), e.getMessage() ); } diff --git a/src/test/java/com/skyflow/serviceaccount/util/TokenTests.java b/common/src/test/java/com/skyflow/serviceaccount/util/TokenTests.java similarity index 94% rename from src/test/java/com/skyflow/serviceaccount/util/TokenTests.java rename to common/src/test/java/com/skyflow/serviceaccount/util/TokenTests.java index 88887681..cb631071 100644 --- a/src/test/java/com/skyflow/serviceaccount/util/TokenTests.java +++ b/common/src/test/java/com/skyflow/serviceaccount/util/TokenTests.java @@ -1,7 +1,7 @@ package com.skyflow.serviceaccount.util; -import com.skyflow.Skyflow; import com.skyflow.enums.LogLevel; +import com.skyflow.utils.logger.LogUtil; import io.github.cdimascio.dotenv.Dotenv; import org.junit.Assert; import org.junit.BeforeClass; @@ -12,7 +12,7 @@ public class TokenTests { @BeforeClass public static void setup() { - Skyflow skyflowClient = Skyflow.builder().setLogLevel(LogLevel.DEBUG).build(); + LogUtil.setupLogger(LogLevel.DEBUG); } @Test diff --git a/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java b/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java new file mode 100644 index 00000000..024bca74 --- /dev/null +++ b/common/src/test/java/com/skyflow/utils/BaseUtilsTests.java @@ -0,0 +1,138 @@ +package com.skyflow.utils; + +import com.skyflow.config.Credentials; +import com.skyflow.enums.Env; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.ArrayList; + +public class BaseUtilsTests { + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; + private static String clusterId = null; + private static String url = null; + private static String filePath = null; + private static String credentialsString = null; + private static String token = null; + private static String context = null; + private static ArrayList roles = null; + + @BeforeClass + public static void setup() { + clusterId = "test_cluster_id"; + url = "https://test-url.com/java/unit/tests"; + filePath = "invalid/file/path/credentials.json"; + credentialsString = "invalid credentials string"; + token = "invalid-token"; + context = "test_context"; + roles = new ArrayList<>(); + roles.add("test_role"); + } + + @Test + public void testGetVaultURLForDev() { + try { + String vaultURL = BaseUtils.getVaultURL(clusterId, Env.DEV, BaseConstants.V2_VAULT_DOMAIN); + String devUrl = "https://test_cluster_id.vault.skyflowapis.dev"; + Assert.assertEquals(devUrl, vaultURL); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetVaultURLForStage() { + try { + String vaultURL = BaseUtils.getVaultURL(clusterId, Env.STAGE, BaseConstants.V2_VAULT_DOMAIN); + String stageUrl = "https://test_cluster_id.vault.skyflowapis.tech"; + Assert.assertEquals(stageUrl, vaultURL); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetVaultURLForSandbox() { + try { + String vaultURL = BaseUtils.getVaultURL(clusterId, Env.SANDBOX, BaseConstants.V2_VAULT_DOMAIN); + String sandboxUrl = "https://test_cluster_id.vault.skyflowapis-preview.com"; + Assert.assertEquals(sandboxUrl, vaultURL); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetVaultURLForProd() { + try { + String vaultURL = BaseUtils.getVaultURL(clusterId, Env.PROD, BaseConstants.V2_VAULT_DOMAIN); + String prodUrl = "https://test_cluster_id.vault.skyflowapis.com"; + Assert.assertEquals(prodUrl, vaultURL); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetBaseURL() { + try { + String baseURL = BaseUtils.getBaseURL(url); + String expected = "https://test-url.com"; + Assert.assertEquals(expected, baseURL); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGenerateBearerTokenWithCredentialsFile() { + try { + Credentials credentials = new Credentials(); + credentials.setPath(filePath); + credentials.setContext(context); + credentials.setRoles(roles); + BaseUtils.generateBearerToken(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals( + BaseUtils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), filePath), + e.getMessage() + ); + } + } + + @Test + public void testGenerateBearerTokenWithCredentialsString() { + try { + Credentials credentials = new Credentials(); + credentials.setCredentialsString(credentialsString); + credentials.setContext(context); + credentials.setRoles(roles); + BaseUtils.generateBearerToken(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); + Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); + } + } + + @Test + public void testGenerateBearerTokenWithToken() { + try { + Credentials credentials = new Credentials(); + credentials.setToken(token); + credentials.setContext(context); + credentials.setRoles(roles); + String bearerToken = BaseUtils.generateBearerToken(credentials); + Assert.assertEquals(token, bearerToken); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } +} diff --git a/src/test/java/com/skyflow/utils/logger/LogUtilLevelTests.java b/common/src/test/java/com/skyflow/utils/logger/LogUtilLevelTests.java similarity index 100% rename from src/test/java/com/skyflow/utils/logger/LogUtilLevelTests.java rename to common/src/test/java/com/skyflow/utils/logger/LogUtilLevelTests.java diff --git a/src/test/resources/invalidPrivateKeyCredentials.json b/common/src/test/resources/invalidPrivateKeyCredentials.json similarity index 100% rename from src/test/resources/invalidPrivateKeyCredentials.json rename to common/src/test/resources/invalidPrivateKeyCredentials.json diff --git a/src/test/resources/invalidTokenURICredentials.json b/common/src/test/resources/invalidTokenURICredentials.json similarity index 100% rename from src/test/resources/invalidTokenURICredentials.json rename to common/src/test/resources/invalidTokenURICredentials.json diff --git a/src/test/resources/noClientIDCredentials.json b/common/src/test/resources/noClientIDCredentials.json similarity index 100% rename from src/test/resources/noClientIDCredentials.json rename to common/src/test/resources/noClientIDCredentials.json diff --git a/src/test/resources/noKeyIDCredentials.json b/common/src/test/resources/noKeyIDCredentials.json similarity index 100% rename from src/test/resources/noKeyIDCredentials.json rename to common/src/test/resources/noKeyIDCredentials.json diff --git a/src/test/resources/noPrivateKeyCredentials.json b/common/src/test/resources/noPrivateKeyCredentials.json similarity index 100% rename from src/test/resources/noPrivateKeyCredentials.json rename to common/src/test/resources/noPrivateKeyCredentials.json diff --git a/src/test/resources/noTokenURICredentials.json b/common/src/test/resources/noTokenURICredentials.json similarity index 100% rename from src/test/resources/noTokenURICredentials.json rename to common/src/test/resources/noTokenURICredentials.json diff --git a/src/test/resources/notJson.txt b/common/src/test/resources/notJson.txt similarity index 100% rename from src/test/resources/notJson.txt rename to common/src/test/resources/notJson.txt diff --git a/flowvault/dependency-reduced-pom.xml b/flowvault/dependency-reduced-pom.xml new file mode 100644 index 00000000..92fc11f2 --- /dev/null +++ b/flowvault/dependency-reduced-pom.xml @@ -0,0 +1,195 @@ + + + + skyflow + com.skyflow + 1.0.0 + + 4.0.0 + skyflow-flowvault-java + ${project.groupId}:${project.artifactId} + 1.0.0 + Skyflow V3 SDK for the Java programming language + https://github.com/skyflowapi/skyflow-java/tree/main + + + skyflow + skyflow + + + + + The MIT License (MIT) + https://github.com/skyflowapi/skyflow-java/blob/main/LICENSE + + + + + + true + src/main/resources + + + + + maven-shade-plugin + 3.6.0 + + + package + + shade + + + + + com.skyflow:common + + + + + + + + + + + jfrog + + + central + prekarilabs.jfrog.io-releases + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + snapshots + prekarilabs.jfrog.io-snapshots + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + + + maven-central + + + + org.sonatype.central + central-publishing-maven-plugin + 0.4.0 + true + + central + true + true + + + + + + + central + https://central.sonatype.com/api/v1/publisher/upload + + + central-snapshots + https://central.sonatype.com/api/v1/publisher/upload + + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.17.2 + compile + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + 2.18.6 + compile + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + 2.18.6 + compile + + + io.github.cdimascio + dotenv-java + 2.2.0 + compile + + + com.google.code.gson + gson + 2.10.1 + compile + + + com.squareup.okhttp3 + okhttp + 4.12.0 + compile + + + io.jsonwebtoken + jjwt + 0.12.6 + compile + + + junit + junit + 4.13.2 + test + + + hamcrest-core + org.hamcrest + + + + + org.powermock + powermock-module-junit4 + 2.0.9 + test + + + powermock-module-junit4-common + org.powermock + + + hamcrest-core + org.hamcrest + + + + + org.powermock + powermock-api-mockito2 + 2.0.9 + test + + + powermock-api-support + org.powermock + + + mockito-core + org.mockito + + + + + + UTF-8 + 8 + false + 8 + ${project.version} + + diff --git a/flowvault/pom.xml b/flowvault/pom.xml new file mode 100644 index 00000000..1efc6173 --- /dev/null +++ b/flowvault/pom.xml @@ -0,0 +1,129 @@ + + + 4.0.0 + + com.skyflow + skyflow + 1.0.0 + ../pom.xml + + + skyflow-flowvault-java + 1.0.0 + jar + ${project.groupId}:${project.artifactId} + Skyflow V3 SDK for the Java programming language + https://github.com/skyflowapi/skyflow-java/tree/main + + + + The MIT License (MIT) + https://github.com/skyflowapi/skyflow-java/blob/main/LICENSE + + + + + skyflow + skyflow + + + + + 8 + 8 + UTF-8 + false + ${project.version} + + + + + + + com.skyflow + common + 1.0.0 + compile + + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + + package + + shade + + + + + com.skyflow:common + + + + + + + + + + + + jfrog + + + central + prekarilabs.jfrog.io-releases + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + snapshots + prekarilabs.jfrog.io-snapshots + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + + + maven-central + + + central + https://central.sonatype.com/api/v1/publisher/upload + + + central-snapshots + https://central.sonatype.com/api/v1/publisher/upload + + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.4.0 + true + + central + true + true + + + + + + + + diff --git a/flowvault/src/main/java/com/skyflow/Skyflow.java b/flowvault/src/main/java/com/skyflow/Skyflow.java new file mode 100644 index 00000000..96b5f45a --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/Skyflow.java @@ -0,0 +1,118 @@ +package com.skyflow; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.Constants; +import com.skyflow.utils.SdkVersion; +import com.skyflow.utils.Utils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.utils.validations.Validations; +import com.skyflow.vault.controller.VaultController; + +import java.util.LinkedHashMap; + +public final class Skyflow extends BaseSkyflow { + + private final SkyflowClientBuilder builder; + + private Skyflow(SkyflowClientBuilder builder) { + super(builder); + this.builder = builder; + } + + @Override + protected Skyflow self() { + return this; + } + + public static SkyflowClientBuilder builder() { + SdkVersion.setSdkPrefix(Constants.SDK_PREFIX); + return new SkyflowClientBuilder(); + } + + public VaultConfig getVaultConfig() { + Object[] array = this.builder.vaultConfigMap.values().toArray(); + return (VaultConfig) array[0]; + } + + public VaultController vault() throws SkyflowException { + return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + public static final class SkyflowClientBuilder extends BaseSkyflowClientBuilder { + private final LinkedHashMap vaultClientsMap = new LinkedHashMap<>(); + + @Override + protected void validateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + Validations.validateVaultConfiguration(vaultConfig); + } + + @Override + protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowException { + this.vaultClientsMap.put(vaultConfig.getVaultId(), new VaultController(vaultConfig, this.skyflowCredentials)); + LogUtil.printInfoLog(Utils.parameterizedString(InfoLogs.VAULT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); + } + + @Override + protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowException { + this.vaultClientsMap.put(updatedConfig.getVaultId(), new VaultController(updatedConfig, this.skyflowCredentials)); + } + + @Override + protected void onVaultConfigRemoved(String vaultId) throws SkyflowException { + this.vaultClientsMap.remove(vaultId); + } + + @Override + protected boolean hasVaultClient(String vaultId) { + return this.vaultClientsMap.containsKey(vaultId); + } + + @Override + protected void onCredentialsUpdated(Credentials credentials) throws SkyflowException { + for (VaultController vault : this.vaultClientsMap.values()) { + vault.setCommonCredentials(credentials); + } + } + + @Override + public SkyflowClientBuilder addVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + super.addVaultConfig(vaultConfig); + return this; + } + + @Override + public SkyflowClientBuilder updateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + super.updateVaultConfig(vaultConfig); + return this; + } + + @Override + public SkyflowClientBuilder removeVaultConfig(String vaultId) throws SkyflowException { + super.removeVaultConfig(vaultId); + return this; + } + + @Override + public SkyflowClientBuilder addSkyflowCredentials(Credentials credentials) throws SkyflowException { + super.addSkyflowCredentials(credentials); + return this; + } + + @Override + public SkyflowClientBuilder setLogLevel(LogLevel logLevel) { + super.setLogLevel(logLevel); + return this; + } + + public Skyflow build() { + return new Skyflow(this); + } + } + +} \ No newline at end of file diff --git a/flowvault/src/main/java/com/skyflow/VaultClient.java b/flowvault/src/main/java/com/skyflow/VaultClient.java new file mode 100644 index 00000000..9f326349 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/VaultClient.java @@ -0,0 +1,66 @@ +package com.skyflow; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.ApiClient; +import com.skyflow.generated.rest.ApiClientBuilder; +import com.skyflow.generated.rest.resources.flowservice.FlowserviceClient; +import com.skyflow.utils.Utils; + +public class VaultClient extends BaseVaultClient { + private final ApiClientBuilder apiClientBuilder; + private ApiClient apiClient; + + protected VaultClient(VaultConfig vaultConfig, Credentials credentials) throws SkyflowException { + super(vaultConfig, credentials); + this.apiClientBuilder = new ApiClientBuilder(); + this.apiClient = null; + updateVaultURL(); + } + + protected FlowserviceClient getRecordsApi() { + return this.apiClient.flowservice(); + } + + protected void setCommonCredentials(Credentials commonCredentials) throws SkyflowException { + this.commonCredentials = commonCredentials; + super.prioritiseCredentials(this.vaultConfig.getCredentials()); + } + + protected synchronized void setBearerToken() throws SkyflowException { + super.setBearerToken(this.vaultConfig.getCredentials()); + if (apiClient == null) { + updateExecutorInHTTP(); + this.apiClient = this.apiClientBuilder.build(); + } + } + + private void updateVaultURL() throws SkyflowException { + // Fetch vaultURL from ENV + String vaultURL = Utils.getEnvVaultURL(); + + // If vaultURL from ENV is null or empty, fetch vaultURL from vault config + if (vaultURL == null || vaultURL.isEmpty()) { + vaultURL = this.vaultConfig.getVaultURL(); + } + + // If vaultURL from vault config is also null or empty, construct vaultURL from clusterId passed in vault config + if (vaultURL == null || vaultURL.isEmpty()) { + vaultURL = Utils.getVaultURL(this.vaultConfig.getClusterId(), this.vaultConfig.getEnv()); + } + this.apiClientBuilder.url(vaultURL); + if (!vaultURL.equals(this.currentVaultURL)) { + this.currentVaultURL = vaultURL; + this.apiClient = null; + } + } + + protected void updateExecutorInHTTP() { + if (sharedHttpClient == null) { + sharedHttpClient = buildSharedHttpClient(() -> this.token); + apiClientBuilder.httpClient(sharedHttpClient); + } + } + +} diff --git a/flowvault/src/main/java/com/skyflow/config/VaultConfig.java b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java new file mode 100644 index 00000000..8966d29f --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/config/VaultConfig.java @@ -0,0 +1,20 @@ +package com.skyflow.config; + +public class VaultConfig extends BaseVaultConfig { + + private String vaultURL; + + public VaultConfig() { + super(); + this.vaultURL = null; + } + + public String getVaultURL() { + return vaultURL; + } + + public void setVaultURL(String vaultURL) { + this.vaultURL = vaultURL; + } + +} diff --git a/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java b/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java new file mode 100644 index 00000000..1dcf86b6 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/enums/InterfaceName.java @@ -0,0 +1,19 @@ +package com.skyflow.enums; + +public enum InterfaceName { + INSERT("insert"), + DETOKENIZE("detokenize"), + DELETE("delete tokens"), + TOKENIZE("tokenize"); + + + private final String interfaceName; + + InterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getName() { + return interfaceName; + } +} diff --git a/flowvault/src/main/java/com/skyflow/enums/UpsertType.java b/flowvault/src/main/java/com/skyflow/enums/UpsertType.java new file mode 100644 index 00000000..fa2350d2 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/enums/UpsertType.java @@ -0,0 +1,18 @@ +package com.skyflow.enums; + +public enum UpsertType { + UPDATE("UPDATE"), + + REPLACE("REPLACE"); + + private final String value; + + UpsertType(String value) { + this.value = value; + } + + @Override + public String toString() { + return this.value; + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/ApiClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/ApiClient.java new file mode 100644 index 00000000..02b972dd --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/ApiClient.java @@ -0,0 +1,37 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.Suppliers; +import com.skyflow.generated.rest.resources.flowservice.FlowserviceClient; +import com.skyflow.generated.rest.resources.records.RecordsClient; + +import java.util.function.Supplier; + +public class ApiClient { + protected final ClientOptions clientOptions; + + protected final Supplier recordsClient; + + protected final Supplier flowserviceClient; + + public ApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.recordsClient = Suppliers.memoize(() -> new RecordsClient(clientOptions)); + this.flowserviceClient = Suppliers.memoize(() -> new FlowserviceClient(clientOptions)); + } + + public RecordsClient records() { + return this.recordsClient.get(); + } + + public FlowserviceClient flowservice() { + return this.flowserviceClient.get(); + } + + public static ApiClientBuilder builder() { + return new ApiClientBuilder(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java b/flowvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java new file mode 100644 index 00000000..fa3d6e9d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java @@ -0,0 +1,48 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.Environment; +import okhttp3.OkHttpClient; + +public final class ApiClientBuilder { + private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); + + private Environment environment; + + public ApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public ApiClientBuilder timeout(int timeout) { + this.clientOptionsBuilder.timeout(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public ApiClientBuilder maxRetries(int maxRetries) { + this.clientOptionsBuilder.maxRetries(maxRetries); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public ApiClientBuilder httpClient(OkHttpClient httpClient) { + this.clientOptionsBuilder.httpClient(httpClient); + return this; + } + + public ApiClient build() { + clientOptionsBuilder.environment(this.environment); + return new ApiClient(clientOptionsBuilder.build()); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java new file mode 100644 index 00000000..840c0bad --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java @@ -0,0 +1,37 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.Suppliers; +import com.skyflow.generated.rest.resources.flowservice.AsyncFlowserviceClient; +import com.skyflow.generated.rest.resources.records.AsyncRecordsClient; + +import java.util.function.Supplier; + +public class AsyncApiClient { + protected final ClientOptions clientOptions; + + protected final Supplier recordsClient; + + protected final Supplier flowserviceClient; + + public AsyncApiClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.recordsClient = Suppliers.memoize(() -> new AsyncRecordsClient(clientOptions)); + this.flowserviceClient = Suppliers.memoize(() -> new AsyncFlowserviceClient(clientOptions)); + } + + public AsyncRecordsClient records() { + return this.recordsClient.get(); + } + + public AsyncFlowserviceClient flowservice() { + return this.flowserviceClient.get(); + } + + public static AsyncApiClientBuilder builder() { + return new AsyncApiClientBuilder(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java b/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java new file mode 100644 index 00000000..10c08d51 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java @@ -0,0 +1,48 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.Environment; +import okhttp3.OkHttpClient; + +public final class AsyncApiClientBuilder { + private ClientOptions.Builder clientOptionsBuilder = ClientOptions.builder(); + + private Environment environment; + + public AsyncApiClientBuilder url(String url) { + this.environment = Environment.custom(url); + return this; + } + + /** + * Sets the timeout (in seconds) for the client. Defaults to 60 seconds. + */ + public AsyncApiClientBuilder timeout(int timeout) { + this.clientOptionsBuilder.timeout(timeout); + return this; + } + + /** + * Sets the maximum number of retries for the client. Defaults to 2 retries. + */ + public AsyncApiClientBuilder maxRetries(int maxRetries) { + this.clientOptionsBuilder.maxRetries(maxRetries); + return this; + } + + /** + * Sets the underlying OkHttp client + */ + public AsyncApiClientBuilder httpClient(OkHttpClient httpClient) { + this.clientOptionsBuilder.httpClient(httpClient); + return this; + } + + public AsyncApiClient build() { + clientOptionsBuilder.environment(this.environment); + return new AsyncApiClient(clientOptionsBuilder.build()); + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java index 4fab1d41..be5247eb 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java @@ -3,11 +3,12 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.Response; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import okhttp3.Response; /** * This exception type will be thrown for any non-2XX API responses. diff --git a/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/ApiClientException.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java diff --git a/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java index 9c81f1f5..c743352c 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java @@ -3,11 +3,12 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.Response; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import okhttp3.Response; public final class ApiClientHttpResponse { diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java new file mode 100644 index 00000000..2a5f0710 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java @@ -0,0 +1,171 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.OkHttpClient; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +public final class ClientOptions { + private final Environment environment; + + private final Map headers; + + private final Map> headerSuppliers; + + private final OkHttpClient httpClient; + + private final int timeout; + + private ClientOptions( + Environment environment, + Map headers, + Map> headerSuppliers, + OkHttpClient httpClient, + int timeout) { + this.environment = environment; + this.headers = new HashMap<>(); + this.headers.putAll(headers); + this.headers.putAll(new HashMap() { + { + put("X-Fern-Language", "JAVA"); + put("X-Fern-SDK-Name", "com.skyflow.fern:api-sdk"); + put("X-Fern-SDK-Version", "0.0.98"); + } + }); + this.headerSuppliers = headerSuppliers; + this.httpClient = httpClient; + this.timeout = timeout; + } + + public Environment environment() { + return this.environment; + } + + public Map headers(RequestOptions requestOptions) { + Map values = new HashMap<>(this.headers); + headerSuppliers.forEach((key, supplier) -> { + values.put(key, supplier.get()); + }); + if (requestOptions != null) { + values.putAll(requestOptions.getHeaders()); + } + return values; + } + + public int timeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.timeout; + } + return requestOptions.getTimeout().orElse(this.timeout); + } + + public OkHttpClient httpClient() { + return this.httpClient; + } + + public OkHttpClient httpClientWithTimeout(RequestOptions requestOptions) { + if (requestOptions == null) { + return this.httpClient; + } + return this.httpClient + .newBuilder() + .callTimeout(requestOptions.getTimeout().get(), requestOptions.getTimeoutTimeUnit()) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .build(); + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private Environment environment; + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + private int maxRetries = 2; + + private Optional timeout = Optional.empty(); + + private OkHttpClient httpClient = null; + + public Builder environment(Environment environment) { + this.environment = environment; + return this; + } + + public Builder addHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(int timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + /** + * Override the timeout in seconds. Defaults to 60 seconds. + */ + public Builder timeout(Optional timeout) { + this.timeout = timeout; + return this; + } + + /** + * Override the maximum number of retries. Defaults to 2 retries. + */ + public Builder maxRetries(int maxRetries) { + this.maxRetries = maxRetries; + return this; + } + + public Builder httpClient(OkHttpClient httpClient) { + this.httpClient = httpClient; + return this; + } + + public ClientOptions build() { + OkHttpClient.Builder httpClientBuilder = + this.httpClient != null ? this.httpClient.newBuilder() : new OkHttpClient.Builder(); + + if (this.httpClient != null) { + timeout.ifPresent(timeout -> httpClientBuilder + .callTimeout(timeout, TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS)); + } else { + httpClientBuilder + .callTimeout(this.timeout.orElse(60), TimeUnit.SECONDS) + .connectTimeout(0, TimeUnit.SECONDS) + .writeTimeout(0, TimeUnit.SECONDS) + .readTimeout(0, TimeUnit.SECONDS) + .addInterceptor(new RetryInterceptor(this.maxRetries)); + } + + this.httpClient = httpClientBuilder.build(); + this.timeout = Optional.of(httpClient.callTimeoutMillis() / 1000); + + return new ClientOptions(environment, headers, headerSuppliers, httpClient, this.timeout.get()); + } + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java index 6be10979..a0a6d7c4 100644 --- a/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.module.SimpleModule; + import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/core/Environment.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/Environment.java new file mode 100644 index 00000000..2fc27c36 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/Environment.java @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +public final class Environment { + private final String url; + + private Environment(String url) { + this.url = url; + } + + public String getUrl() { + return this.url; + } + + public static Environment custom(String url) { + return new Environment(url); + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/FileStream.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/FileStream.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java index 6b459431..2131b0a4 100644 --- a/src/main/java/com/skyflow/generated/rest/core/FileStream.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/FileStream.java @@ -3,12 +3,13 @@ */ package com.skyflow.generated.rest.core; -import java.io.InputStream; -import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; import org.jetbrains.annotations.Nullable; +import java.io.InputStream; +import java.util.Objects; + /** * Represents a file stream with associated metadata for file uploads. */ diff --git a/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java index 545f6088..55c3c971 100644 --- a/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java @@ -3,9 +3,6 @@ */ package com.skyflow.generated.rest.core; -import java.io.IOException; -import java.io.InputStream; -import java.util.Objects; import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.internal.Util; @@ -14,6 +11,10 @@ import okio.Source; import org.jetbrains.annotations.Nullable; +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + /** * A custom implementation of OkHttp's RequestBody that wraps an InputStream. * This class allows streaming of data from an InputStream directly to an HTTP request body, diff --git a/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/MediaTypes.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java diff --git a/src/main/java/com/skyflow/generated/rest/core/Nullable.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/Nullable.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/Nullable.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/Nullable.java diff --git a/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java diff --git a/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java index 3b7894e0..acec32b4 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java @@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + import java.io.IOException; public final class ObjectMappers { diff --git a/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java index e9e18fb9..c0687736 100644 --- a/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java @@ -7,14 +7,11 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; -import java.util.AbstractMap; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; import okhttp3.HttpUrl; import okhttp3.MultipartBody; +import java.util.*; + public class QueryStringMapper { private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java new file mode 100644 index 00000000..b8a8d14b --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java @@ -0,0 +1,87 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; + +public final class RequestOptions { + private final Optional timeout; + + private final TimeUnit timeoutTimeUnit; + + private final Map headers; + + private final Map> headerSuppliers; + + private RequestOptions( + Optional timeout, + TimeUnit timeoutTimeUnit, + Map headers, + Map> headerSuppliers) { + this.timeout = timeout; + this.timeoutTimeUnit = timeoutTimeUnit; + this.headers = headers; + this.headerSuppliers = headerSuppliers; + } + + public Optional getTimeout() { + return timeout; + } + + public TimeUnit getTimeoutTimeUnit() { + return timeoutTimeUnit; + } + + public Map getHeaders() { + Map headers = new HashMap<>(); + headers.putAll(this.headers); + this.headerSuppliers.forEach((key, supplier) -> { + headers.put(key, supplier.get()); + }); + return headers; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private Optional timeout = Optional.empty(); + + private TimeUnit timeoutTimeUnit = TimeUnit.SECONDS; + + private final Map headers = new HashMap<>(); + + private final Map> headerSuppliers = new HashMap<>(); + + public Builder timeout(Integer timeout) { + this.timeout = Optional.of(timeout); + return this; + } + + public Builder timeout(Integer timeout, TimeUnit timeoutTimeUnit) { + this.timeout = Optional.of(timeout); + this.timeoutTimeUnit = timeoutTimeUnit; + return this; + } + + public Builder addHeader(String key, String value) { + this.headers.put(key, value); + return this; + } + + public Builder addHeader(String key, Supplier value) { + this.headerSuppliers.put(key, value); + return this; + } + + public RequestOptions build() { + return new RequestOptions(timeout, timeoutTimeUnit, headers, headerSuppliers); + } + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java index d8df7715..1bb0b5dc 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java @@ -3,9 +3,10 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.Response; + import java.io.FilterInputStream; import java.io.IOException; -import okhttp3.Response; /** * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the diff --git a/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java index ed894407..e6c1a525 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java @@ -3,9 +3,10 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.Response; + import java.io.FilterReader; import java.io.IOException; -import okhttp3.Response; /** * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the diff --git a/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java index eda7d265..7a28c3c9 100644 --- a/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java +++ b/flowvault/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java @@ -3,12 +3,13 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.Interceptor; +import okhttp3.Response; + import java.io.IOException; import java.time.Duration; import java.util.Optional; import java.util.Random; -import okhttp3.Interceptor; -import okhttp3.Response; public class RetryInterceptor implements Interceptor { diff --git a/src/main/java/com/skyflow/generated/rest/core/Stream.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/Stream.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/Stream.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/Stream.java diff --git a/src/main/java/com/skyflow/generated/rest/core/Suppliers.java b/flowvault/src/main/java/com/skyflow/generated/rest/core/Suppliers.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/Suppliers.java rename to flowvault/src/main/java/com/skyflow/generated/rest/core/Suppliers.java diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncFlowserviceClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncFlowserviceClient.java new file mode 100644 index 00000000..1fd59fe9 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncFlowserviceClient.java @@ -0,0 +1,129 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.flowservice.requests.*; +import com.skyflow.generated.rest.types.*; + +import java.util.concurrent.CompletableFuture; + +public class AsyncFlowserviceClient { + protected final ClientOptions clientOptions; + + private final AsyncRawFlowserviceClient rawClient; + + public AsyncFlowserviceClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawFlowserviceClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawFlowserviceClient withRawResponse() { + return this.rawClient; + } + + public CompletableFuture delete() { + return this.rawClient.delete().thenApply(response -> response.body()); + } + + public CompletableFuture delete(V1DeleteRequest request) { + return this.rawClient.delete(request).thenApply(response -> response.body()); + } + + public CompletableFuture delete(V1DeleteRequest request, RequestOptions requestOptions) { + return this.rawClient.delete(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture get() { + return this.rawClient.get().thenApply(response -> response.body()); + } + + public CompletableFuture get(V1GetRequest request) { + return this.rawClient.get(request).thenApply(response -> response.body()); + } + + public CompletableFuture get(V1GetRequest request, RequestOptions requestOptions) { + return this.rawClient.get(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture insert() { + return this.rawClient.insert().thenApply(response -> response.body()); + } + + public CompletableFuture insert(V1InsertRequest request) { + return this.rawClient.insert(request).thenApply(response -> response.body()); + } + + public CompletableFuture insert(V1InsertRequest request, RequestOptions requestOptions) { + return this.rawClient.insert(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture update() { + return this.rawClient.update().thenApply(response -> response.body()); + } + + public CompletableFuture update(V1UpdateRequest request) { + return this.rawClient.update(request).thenApply(response -> response.body()); + } + + public CompletableFuture update(V1UpdateRequest request, RequestOptions requestOptions) { + return this.rawClient.update(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture deletetoken() { + return this.rawClient.deletetoken().thenApply(response -> response.body()); + } + + public CompletableFuture deletetoken(V1FlowDeleteTokenRequest request) { + return this.rawClient.deletetoken(request).thenApply(response -> response.body()); + } + + public CompletableFuture deletetoken( + V1FlowDeleteTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.deletetoken(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture detokenize() { + return this.rawClient.detokenize().thenApply(response -> response.body()); + } + + public CompletableFuture detokenize(V1FlowDetokenizeRequest request) { + return this.rawClient.detokenize(request).thenApply(response -> response.body()); + } + + public CompletableFuture detokenize( + V1FlowDetokenizeRequest request, RequestOptions requestOptions) { + return this.rawClient.detokenize(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture tokenize() { + return this.rawClient.tokenize().thenApply(response -> response.body()); + } + + public CompletableFuture tokenize(V1FlowTokenizeRequest request) { + return this.rawClient.tokenize(request).thenApply(response -> response.body()); + } + + public CompletableFuture tokenize( + V1FlowTokenizeRequest request, RequestOptions requestOptions) { + return this.rawClient.tokenize(request, requestOptions).thenApply(response -> response.body()); + } + + public CompletableFuture flowvaultmetrics() { + return this.rawClient.flowvaultmetrics().thenApply(response -> response.body()); + } + + public CompletableFuture flowvaultmetrics(V1FlowVaultMetricsRequest request) { + return this.rawClient.flowvaultmetrics(request).thenApply(response -> response.body()); + } + + public CompletableFuture flowvaultmetrics( + V1FlowVaultMetricsRequest request, RequestOptions requestOptions) { + return this.rawClient.flowvaultmetrics(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncRawFlowserviceClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncRawFlowserviceClient.java new file mode 100644 index 00000000..17f85d0c --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/AsyncRawFlowserviceClient.java @@ -0,0 +1,533 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.resources.flowservice.requests.*; +import com.skyflow.generated.rest.types.*; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; + +public class AsyncRawFlowserviceClient { + protected final ClientOptions clientOptions; + + public AsyncRawFlowserviceClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public CompletableFuture> delete() { + return delete(V1DeleteRequest.builder().build()); + } + + public CompletableFuture> delete(V1DeleteRequest request) { + return delete(request, null); + } + + public CompletableFuture> delete( + V1DeleteRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/delete") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> get() { + return get(V1GetRequest.builder().build()); + } + + public CompletableFuture> get(V1GetRequest request) { + return get(request, null); + } + + public CompletableFuture> get( + V1GetRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/get") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> insert() { + return insert(V1InsertRequest.builder().build()); + } + + public CompletableFuture> insert(V1InsertRequest request) { + return insert(request, null); + } + + public CompletableFuture> insert( + V1InsertRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/insert") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1InsertResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> update() { + return update(V1UpdateRequest.builder().build()); + } + + public CompletableFuture> update(V1UpdateRequest request) { + return update(request, null); + } + + public CompletableFuture> update( + V1UpdateRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/update") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> deletetoken() { + return deletetoken(V1FlowDeleteTokenRequest.builder().build()); + } + + public CompletableFuture> deletetoken( + V1FlowDeleteTokenRequest request) { + return deletetoken(request, null); + } + + public CompletableFuture> deletetoken( + V1FlowDeleteTokenRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/delete") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBody.string(), V1FlowDeleteTokenResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> detokenize() { + return detokenize(V1FlowDetokenizeRequest.builder().build()); + } + + public CompletableFuture> detokenize( + V1FlowDetokenizeRequest request) { + return detokenize(request, null); + } + + public CompletableFuture> detokenize( + V1FlowDetokenizeRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/detokenize") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBody.string(), V1FlowDetokenizeResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> tokenize() { + return tokenize(V1FlowTokenizeRequest.builder().build()); + } + + public CompletableFuture> tokenize(V1FlowTokenizeRequest request) { + return tokenize(request, null); + } + + public CompletableFuture> tokenize( + V1FlowTokenizeRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/tokenize") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBody.string(), V1FlowTokenizeResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } + + public CompletableFuture> flowvaultmetrics() { + return flowvaultmetrics(V1FlowVaultMetricsRequest.builder().build()); + } + + public CompletableFuture> flowvaultmetrics( + V1FlowVaultMetricsRequest request) { + return flowvaultmetrics(request, null); + } + + public CompletableFuture> flowvaultmetrics( + V1FlowVaultMetricsRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults/metrics") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBody.string(), V1FlowVaultMetricsResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/FlowserviceClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/FlowserviceClient.java new file mode 100644 index 00000000..8da9c9a5 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/FlowserviceClient.java @@ -0,0 +1,124 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.flowservice.requests.*; +import com.skyflow.generated.rest.types.*; + +public class FlowserviceClient { + protected final ClientOptions clientOptions; + + private final RawFlowserviceClient rawClient; + + public FlowserviceClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawFlowserviceClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawFlowserviceClient withRawResponse() { + return this.rawClient; + } + + public V1DeleteResponse delete() { + return this.rawClient.delete().body(); + } + + public V1DeleteResponse delete(V1DeleteRequest request) { + return this.rawClient.delete(request).body(); + } + + public V1DeleteResponse delete(V1DeleteRequest request, RequestOptions requestOptions) { + return this.rawClient.delete(request, requestOptions).body(); + } + + public V1GetResponse get() { + return this.rawClient.get().body(); + } + + public V1GetResponse get(V1GetRequest request) { + return this.rawClient.get(request).body(); + } + + public V1GetResponse get(V1GetRequest request, RequestOptions requestOptions) { + return this.rawClient.get(request, requestOptions).body(); + } + + public V1InsertResponse insert() { + return this.rawClient.insert().body(); + } + + public V1InsertResponse insert(V1InsertRequest request) { + return this.rawClient.insert(request).body(); + } + + public V1InsertResponse insert(V1InsertRequest request, RequestOptions requestOptions) { + return this.rawClient.insert(request, requestOptions).body(); + } + + public V1UpdateResponse update() { + return this.rawClient.update().body(); + } + + public V1UpdateResponse update(V1UpdateRequest request) { + return this.rawClient.update(request).body(); + } + + public V1UpdateResponse update(V1UpdateRequest request, RequestOptions requestOptions) { + return this.rawClient.update(request, requestOptions).body(); + } + + public V1FlowDeleteTokenResponse deletetoken() { + return this.rawClient.deletetoken().body(); + } + + public V1FlowDeleteTokenResponse deletetoken(V1FlowDeleteTokenRequest request) { + return this.rawClient.deletetoken(request).body(); + } + + public V1FlowDeleteTokenResponse deletetoken(V1FlowDeleteTokenRequest request, RequestOptions requestOptions) { + return this.rawClient.deletetoken(request, requestOptions).body(); + } + + public V1FlowDetokenizeResponse detokenize() { + return this.rawClient.detokenize().body(); + } + + public V1FlowDetokenizeResponse detokenize(V1FlowDetokenizeRequest request) { + return this.rawClient.detokenize(request).body(); + } + + public V1FlowDetokenizeResponse detokenize(V1FlowDetokenizeRequest request, RequestOptions requestOptions) { + return this.rawClient.detokenize(request, requestOptions).body(); + } + + public V1FlowTokenizeResponse tokenize() { + return this.rawClient.tokenize().body(); + } + + public V1FlowTokenizeResponse tokenize(V1FlowTokenizeRequest request) { + return this.rawClient.tokenize(request).body(); + } + + public V1FlowTokenizeResponse tokenize(V1FlowTokenizeRequest request, RequestOptions requestOptions) { + return this.rawClient.tokenize(request, requestOptions).body(); + } + + public V1FlowVaultMetricsResponse flowvaultmetrics() { + return this.rawClient.flowvaultmetrics().body(); + } + + public V1FlowVaultMetricsResponse flowvaultmetrics(V1FlowVaultMetricsRequest request) { + return this.rawClient.flowvaultmetrics(request).body(); + } + + public V1FlowVaultMetricsResponse flowvaultmetrics( + V1FlowVaultMetricsRequest request, RequestOptions requestOptions) { + return this.rawClient.flowvaultmetrics(request, requestOptions).body(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/RawFlowserviceClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/RawFlowserviceClient.java new file mode 100644 index 00000000..f1203085 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/RawFlowserviceClient.java @@ -0,0 +1,412 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.resources.flowservice.requests.*; +import com.skyflow.generated.rest.types.*; +import okhttp3.*; + +import java.io.IOException; + +public class RawFlowserviceClient { + protected final ClientOptions clientOptions; + + public RawFlowserviceClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + public ApiClientHttpResponse delete() { + return delete(V1DeleteRequest.builder().build()); + } + + public ApiClientHttpResponse delete(V1DeleteRequest request) { + return delete(request, null); + } + + public ApiClientHttpResponse delete(V1DeleteRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/delete") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1DeleteResponse.class), response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse get() { + return get(V1GetRequest.builder().build()); + } + + public ApiClientHttpResponse get(V1GetRequest request) { + return get(request, null); + } + + public ApiClientHttpResponse get(V1GetRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/get") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1GetResponse.class), response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse insert() { + return insert(V1InsertRequest.builder().build()); + } + + public ApiClientHttpResponse insert(V1InsertRequest request) { + return insert(request, null); + } + + public ApiClientHttpResponse insert(V1InsertRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/insert") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1InsertResponse.class), response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse update() { + return update(V1UpdateRequest.builder().build()); + } + + public ApiClientHttpResponse update(V1UpdateRequest request) { + return update(request, null); + } + + public ApiClientHttpResponse update(V1UpdateRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/records/update") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1UpdateResponse.class), response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse deletetoken() { + return deletetoken(V1FlowDeleteTokenRequest.builder().build()); + } + + public ApiClientHttpResponse deletetoken(V1FlowDeleteTokenRequest request) { + return deletetoken(request, null); + } + + public ApiClientHttpResponse deletetoken( + V1FlowDeleteTokenRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/delete") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FlowDeleteTokenResponse.class), + response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse detokenize() { + return detokenize(V1FlowDetokenizeRequest.builder().build()); + } + + public ApiClientHttpResponse detokenize(V1FlowDetokenizeRequest request) { + return detokenize(request, null); + } + + public ApiClientHttpResponse detokenize( + V1FlowDetokenizeRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/detokenize") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FlowDetokenizeResponse.class), + response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse tokenize() { + return tokenize(V1FlowTokenizeRequest.builder().build()); + } + + public ApiClientHttpResponse tokenize(V1FlowTokenizeRequest request) { + return tokenize(request, null); + } + + public ApiClientHttpResponse tokenize( + V1FlowTokenizeRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/tokens/tokenize") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FlowTokenizeResponse.class), + response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } + + public ApiClientHttpResponse flowvaultmetrics() { + return flowvaultmetrics(V1FlowVaultMetricsRequest.builder().build()); + } + + public ApiClientHttpResponse flowvaultmetrics(V1FlowVaultMetricsRequest request) { + return flowvaultmetrics(request, null); + } + + public ApiClientHttpResponse flowvaultmetrics( + V1FlowVaultMetricsRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/vaults/metrics") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1FlowVaultMetricsResponse.class), + response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1DeleteRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1DeleteRequest.java new file mode 100644 index 00000000..27e22a8d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1DeleteRequest.java @@ -0,0 +1,186 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.V1UniqueValue; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DeleteRequest.Builder.class) +public final class V1DeleteRequest { + private final Optional vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private V1DeleteRequest( + Optional vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> uniqueValues, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where data is being deleted + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Name of the table where data is being deleted + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow ID for the record to be deleted + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of unique constraint values to query records by data + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DeleteRequest && equalTo((V1DeleteRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DeleteRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && uniqueValues.equals(other.uniqueValues); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.skyflowIDs, this.uniqueValues); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional> uniqueValues = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DeleteRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

ID of the vault where data is being deleted

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Name of the table where data is being deleted

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

Skyflow ID for the record to be deleted

+ */ + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public Builder skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + public Builder skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

List of unique constraint values to query records by data

+ */ + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public Builder uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + public Builder uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + public V1DeleteRequest build() { + return new V1DeleteRequest(vaultId, tableName, skyflowIDs, uniqueValues, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDeleteTokenRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDeleteTokenRequest.java new file mode 100644 index 00000000..6bc8a4e6 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDeleteTokenRequest.java @@ -0,0 +1,122 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowDeleteTokenRequest.Builder.class) +public final class V1FlowDeleteTokenRequest { + private final Optional vaultId; + + private final Optional> tokens; + + private final Map additionalProperties; + + private V1FlowDeleteTokenRequest( + Optional vaultId, Optional> tokens, Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return Vault ID + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Token value + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowDeleteTokenRequest && equalTo((V1FlowDeleteTokenRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowDeleteTokenRequest other) { + return vaultId.equals(other.vaultId) && tokens.equals(other.tokens); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowDeleteTokenRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + return this; + } + + /** + *

Vault ID

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Token value

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(List tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + public V1FlowDeleteTokenRequest build() { + return new V1FlowDeleteTokenRequest(vaultId, tokens, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDetokenizeRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDetokenizeRequest.java new file mode 100644 index 00000000..bdbe3bf2 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowDetokenizeRequest.java @@ -0,0 +1,156 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.V1TokenGroupRedactions; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowDetokenizeRequest.Builder.class) +public final class V1FlowDetokenizeRequest { + private final Optional vaultId; + + private final Optional> tokens; + + private final Optional> tokenGroupRedactions; + + private final Map additionalProperties; + + private V1FlowDetokenizeRequest( + Optional vaultId, + Optional> tokens, + Optional> tokenGroupRedactions, + Map additionalProperties) { + this.vaultId = vaultId; + this.tokens = tokens; + this.tokenGroupRedactions = tokenGroupRedactions; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where detokenizing + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Token to be detokenized + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return List of token groups to be redacted. + */ + @JsonProperty("tokenGroupRedactions") + public Optional> getTokenGroupRedactions() { + return tokenGroupRedactions; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowDetokenizeRequest && equalTo((V1FlowDetokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowDetokenizeRequest other) { + return vaultId.equals(other.vaultId) + && tokens.equals(other.tokens) + && tokenGroupRedactions.equals(other.tokenGroupRedactions); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tokens, this.tokenGroupRedactions); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional> tokenGroupRedactions = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowDetokenizeRequest other) { + vaultId(other.getVaultId()); + tokens(other.getTokens()); + tokenGroupRedactions(other.getTokenGroupRedactions()); + return this; + } + + /** + *

ID of the vault where detokenizing

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Token to be detokenized

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(List tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

List of token groups to be redacted.

+ */ + @JsonSetter(value = "tokenGroupRedactions", nulls = Nulls.SKIP) + public Builder tokenGroupRedactions(Optional> tokenGroupRedactions) { + this.tokenGroupRedactions = tokenGroupRedactions; + return this; + } + + public Builder tokenGroupRedactions(List tokenGroupRedactions) { + this.tokenGroupRedactions = Optional.ofNullable(tokenGroupRedactions); + return this; + } + + public V1FlowDetokenizeRequest build() { + return new V1FlowDetokenizeRequest(vaultId, tokens, tokenGroupRedactions, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowTokenizeRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowTokenizeRequest.java new file mode 100644 index 00000000..a27d7b62 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowTokenizeRequest.java @@ -0,0 +1,125 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowTokenizeRequest.Builder.class) +public final class V1FlowTokenizeRequest { + private final Optional vaultId; + + private final Optional> data; + + private final Map additionalProperties; + + private V1FlowTokenizeRequest( + Optional vaultId, + Optional> data, + Map additionalProperties) { + this.vaultId = vaultId; + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Vault ID. + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Data to be tokenized + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowTokenizeRequest && equalTo((V1FlowTokenizeRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowTokenizeRequest other) { + return vaultId.equals(other.vaultId) && data.equals(other.data); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.data); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowTokenizeRequest other) { + vaultId(other.getVaultId()); + data(other.getData()); + return this; + } + + /** + *

Vault ID.

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Data to be tokenized

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(List data) { + this.data = Optional.ofNullable(data); + return this; + } + + public V1FlowTokenizeRequest build() { + return new V1FlowTokenizeRequest(vaultId, data, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowVaultMetricsRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowVaultMetricsRequest.java new file mode 100644 index 00000000..026d2d30 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1FlowVaultMetricsRequest.java @@ -0,0 +1,96 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowVaultMetricsRequest.Builder.class) +public final class V1FlowVaultMetricsRequest { + private final Optional vaultId; + + private final Map additionalProperties; + + private V1FlowVaultMetricsRequest(Optional vaultId, Map additionalProperties) { + this.vaultId = vaultId; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault to get metrics for + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowVaultMetricsRequest && equalTo((V1FlowVaultMetricsRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowVaultMetricsRequest other) { + return vaultId.equals(other.vaultId); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowVaultMetricsRequest other) { + vaultId(other.getVaultId()); + return this; + } + + /** + *

ID of the vault to get metrics for

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + public V1FlowVaultMetricsRequest build() { + return new V1FlowVaultMetricsRequest(vaultId, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1GetRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1GetRequest.java new file mode 100644 index 00000000..415f5291 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1GetRequest.java @@ -0,0 +1,357 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.V1ColumnRedactions; +import com.skyflow.generated.rest.types.V1GetRequestData; +import com.skyflow.generated.rest.types.V1UniqueValue; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1GetRequest.Builder.class) +public final class V1GetRequest { + private final Optional vaultId; + + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional limit; + + private final Optional offset; + + private final Optional> uniqueValues; + + private final Optional> records; + + private final Map additionalProperties; + + private V1GetRequest( + Optional vaultId, + Optional tableName, + Optional> skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional limit, + Optional offset, + Optional> uniqueValues, + Optional> records, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.limit = limit; + this.offset = offset; + this.uniqueValues = uniqueValues; + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where data is being fetched + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Name of the table where data is being fetched + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow ID for the record to be fetched + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to be redacted. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to be fetched. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return Limit for the number of records to be fetched + */ + @JsonProperty("limit") + public Optional getLimit() { + return limit; + } + + /** + * @return Offset for the number of records to be fetched + */ + @JsonProperty("offset") + public Optional getOffset() { + return offset; + } + + /** + * @return List of unique constraint values to query records by data + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + /** + * @return List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1GetRequest && equalTo((V1GetRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1GetRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && limit.equals(other.limit) + && offset.equals(other.offset) + && uniqueValues.equals(other.uniqueValues) + && records.equals(other.records); + } + + @Override + public int hashCode() { + return Objects.hash( + this.vaultId, + this.tableName, + this.skyflowIDs, + this.columnRedactions, + this.columns, + this.limit, + this.offset, + this.uniqueValues, + this.records); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional limit = Optional.empty(); + + private Optional offset = Optional.empty(); + + private Optional> uniqueValues = Optional.empty(); + + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1GetRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + limit(other.getLimit()); + offset(other.getOffset()); + uniqueValues(other.getUniqueValues()); + records(other.getRecords()); + return this; + } + + /** + *

ID of the vault where data is being fetched

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Name of the table where data is being fetched

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

Skyflow ID for the record to be fetched

+ */ + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public Builder skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + public Builder skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

List of columns to be redacted.

+ */ + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public Builder columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + public Builder columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

List of columns to be fetched.

+ */ + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public Builder columns(Optional> columns) { + this.columns = columns; + return this; + } + + public Builder columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

Limit for the number of records to be fetched

+ */ + @JsonSetter(value = "limit", nulls = Nulls.SKIP) + public Builder limit(Optional limit) { + this.limit = limit; + return this; + } + + public Builder limit(Integer limit) { + this.limit = Optional.ofNullable(limit); + return this; + } + + /** + *

Offset for the number of records to be fetched

+ */ + @JsonSetter(value = "offset", nulls = Nulls.SKIP) + public Builder offset(Optional offset) { + this.offset = offset; + return this; + } + + public Builder offset(Integer offset) { + this.offset = Optional.ofNullable(offset); + return this; + } + + /** + *

List of unique constraint values to query records by data

+ */ + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public Builder uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + public Builder uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + /** + *

List of records to be fetched. This field contains tableName and skyflowIDs belonging to the table.

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public V1GetRequest build() { + return new V1GetRequest( + vaultId, + tableName, + skyflowIDs, + columnRedactions, + columns, + limit, + offset, + uniqueValues, + records, + additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1InsertRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1InsertRequest.java new file mode 100644 index 00000000..47a58cb2 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1InsertRequest.java @@ -0,0 +1,181 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.V1InsertRecordData; +import com.skyflow.generated.rest.types.V1Upsert; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1InsertRequest.Builder.class) +public final class V1InsertRequest { + private final Optional vaultId; + + private final Optional tableName; + + private final Optional> records; + + private final Optional upsert; + + private final Map additionalProperties; + + private V1InsertRequest( + Optional vaultId, + Optional tableName, + Optional> records, + Optional upsert, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where data is being inserted + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Name of the table where data is being inserted + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return List of data row wise that is to be inserted in the vault + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1InsertRequest && equalTo((V1InsertRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1InsertRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && upsert.equals(other.upsert); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.upsert); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Optional> records = Optional.empty(); + + private Optional upsert = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1InsertRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + upsert(other.getUpsert()); + return this; + } + + /** + *

ID of the vault where data is being inserted

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Name of the table where data is being inserted

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

List of data row wise that is to be inserted in the vault

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public Builder upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + public Builder upsert(V1Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + public V1InsertRequest build() { + return new V1InsertRequest(vaultId, tableName, records, upsert, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1UpdateRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1UpdateRequest.java new file mode 100644 index 00000000..6f8b303e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/flowservice/requests/V1UpdateRequest.java @@ -0,0 +1,181 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.flowservice.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; +import com.skyflow.generated.rest.types.FlowEnumUpdateType; +import com.skyflow.generated.rest.types.V1UpdateRecordData; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1UpdateRequest.Builder.class) +public final class V1UpdateRequest { + private final Optional vaultId; + + private final Optional tableName; + + private final Optional> records; + + private final Optional updateType; + + private final Map additionalProperties; + + private V1UpdateRequest( + Optional vaultId, + Optional tableName, + Optional> records, + Optional updateType, + Map additionalProperties) { + this.vaultId = vaultId; + this.tableName = tableName; + this.records = records; + this.updateType = updateType; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where data is being updated + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Name of the table where data is being updated + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return List of data row wise that is to be updated in the vault + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1UpdateRequest && equalTo((V1UpdateRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1UpdateRequest other) { + return vaultId.equals(other.vaultId) + && tableName.equals(other.tableName) + && records.equals(other.records) + && updateType.equals(other.updateType); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.tableName, this.records, this.updateType); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Optional> records = Optional.empty(); + + private Optional updateType = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1UpdateRequest other) { + vaultId(other.getVaultId()); + tableName(other.getTableName()); + records(other.getRecords()); + updateType(other.getUpdateType()); + return this; + } + + /** + *

ID of the vault where data is being updated

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Name of the table where data is being updated

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

List of data row wise that is to be updated in the vault

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public Builder updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + public Builder updateType(FlowEnumUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + public V1UpdateRequest build() { + return new V1UpdateRequest(vaultId, tableName, records, updateType, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java new file mode 100644 index 00000000..c91ad763 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java @@ -0,0 +1,96 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; +import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.concurrent.CompletableFuture; + +public class AsyncRawRecordsClient { + protected final ClientOptions clientOptions; + + public AsyncRawRecordsClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture> flowServiceExecuteQuery() { + return flowServiceExecuteQuery(V1ExecuteQueryRequest.builder().build()); + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture> flowServiceExecuteQuery( + V1ExecuteQueryRequest request) { + return flowServiceExecuteQuery(request, null); + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture> flowServiceExecuteQuery( + V1ExecuteQueryRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/query") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + CompletableFuture> future = new CompletableFuture<>(); + client.newCall(okhttpRequest).enqueue(new Callback() { + @Override + public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { + try (ResponseBody responseBody = response.body()) { + if (response.isSuccessful()) { + future.complete(new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue( + responseBody.string(), V1ExecuteQueryResponse.class), + response)); + return; + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + future.completeExceptionally(new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response)); + return; + } catch (IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + } + + @Override + public void onFailure(@NotNull Call call, @NotNull IOException e) { + future.completeExceptionally(new ApiClientException("Network error executing HTTP request", e)); + } + }); + return future; + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java new file mode 100644 index 00000000..9af54869 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java @@ -0,0 +1,51 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; +import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; + +import java.util.concurrent.CompletableFuture; + +public class AsyncRecordsClient { + protected final ClientOptions clientOptions; + + private final AsyncRawRecordsClient rawClient; + + public AsyncRecordsClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new AsyncRawRecordsClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public AsyncRawRecordsClient withRawResponse() { + return this.rawClient; + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture flowServiceExecuteQuery() { + return this.rawClient.flowServiceExecuteQuery().thenApply(response -> response.body()); + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture flowServiceExecuteQuery(V1ExecuteQueryRequest request) { + return this.rawClient.flowServiceExecuteQuery(request).thenApply(response -> response.body()); + } + + /** + * Executes a query on the specified vault. + */ + public CompletableFuture flowServiceExecuteQuery( + V1ExecuteQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.flowServiceExecuteQuery(request, requestOptions).thenApply(response -> response.body()); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java new file mode 100644 index 00000000..cf9a1db1 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java @@ -0,0 +1,79 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.skyflow.generated.rest.core.*; +import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; +import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; +import okhttp3.*; + +import java.io.IOException; + +public class RawRecordsClient { + protected final ClientOptions clientOptions; + + public RawRecordsClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + } + + /** + * Executes a query on the specified vault. + */ + public ApiClientHttpResponse flowServiceExecuteQuery() { + return flowServiceExecuteQuery(V1ExecuteQueryRequest.builder().build()); + } + + /** + * Executes a query on the specified vault. + */ + public ApiClientHttpResponse flowServiceExecuteQuery(V1ExecuteQueryRequest request) { + return flowServiceExecuteQuery(request, null); + } + + /** + * Executes a query on the specified vault. + */ + public ApiClientHttpResponse flowServiceExecuteQuery( + V1ExecuteQueryRequest request, RequestOptions requestOptions) { + HttpUrl httpUrl = HttpUrl.parse(this.clientOptions.environment().getUrl()) + .newBuilder() + .addPathSegments("v2/query") + .build(); + RequestBody body; + try { + body = RequestBody.create( + ObjectMappers.JSON_MAPPER.writeValueAsBytes(request), MediaTypes.APPLICATION_JSON); + } catch (JsonProcessingException e) { + throw new ApiClientException("Failed to serialize request", e); + } + Request okhttpRequest = new Request.Builder() + .url(httpUrl) + .method("POST", body) + .headers(Headers.of(clientOptions.headers(requestOptions))) + .addHeader("Content-Type", "application/json") + .addHeader("Accept", "application/json") + .build(); + OkHttpClient client = clientOptions.httpClient(); + if (requestOptions != null && requestOptions.getTimeout().isPresent()) { + client = clientOptions.httpClientWithTimeout(requestOptions); + } + try (Response response = client.newCall(okhttpRequest).execute()) { + ResponseBody responseBody = response.body(); + if (response.isSuccessful()) { + return new ApiClientHttpResponse<>( + ObjectMappers.JSON_MAPPER.readValue(responseBody.string(), V1ExecuteQueryResponse.class), + response); + } + String responseBodyString = responseBody != null ? responseBody.string() : "{}"; + throw new ApiClientApiException( + "Error with status code " + response.code(), + response.code(), + ObjectMappers.JSON_MAPPER.readValue(responseBodyString, Object.class), + response); + } catch (IOException e) { + throw new ApiClientException("Network error executing HTTP request", e); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java new file mode 100644 index 00000000..332c0e1b --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java @@ -0,0 +1,49 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records; + +import com.skyflow.generated.rest.core.ClientOptions; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.records.requests.V1ExecuteQueryRequest; +import com.skyflow.generated.rest.types.V1ExecuteQueryResponse; + +public class RecordsClient { + protected final ClientOptions clientOptions; + + private final RawRecordsClient rawClient; + + public RecordsClient(ClientOptions clientOptions) { + this.clientOptions = clientOptions; + this.rawClient = new RawRecordsClient(clientOptions); + } + + /** + * Get responses with HTTP metadata like headers + */ + public RawRecordsClient withRawResponse() { + return this.rawClient; + } + + /** + * Executes a query on the specified vault. + */ + public V1ExecuteQueryResponse flowServiceExecuteQuery() { + return this.rawClient.flowServiceExecuteQuery().body(); + } + + /** + * Executes a query on the specified vault. + */ + public V1ExecuteQueryResponse flowServiceExecuteQuery(V1ExecuteQueryRequest request) { + return this.rawClient.flowServiceExecuteQuery(request).body(); + } + + /** + * Executes a query on the specified vault. + */ + public V1ExecuteQueryResponse flowServiceExecuteQuery( + V1ExecuteQueryRequest request, RequestOptions requestOptions) { + return this.rawClient.flowServiceExecuteQuery(request, requestOptions).body(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/V1ExecuteQueryRequest.java b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/V1ExecuteQueryRequest.java new file mode 100644 index 00000000..2857faca --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/resources/records/requests/V1ExecuteQueryRequest.java @@ -0,0 +1,125 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.resources.records.requests; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1ExecuteQueryRequest.Builder.class) +public final class V1ExecuteQueryRequest { + private final Optional vaultId; + + private final Optional query; + + private final Map additionalProperties; + + private V1ExecuteQueryRequest( + Optional vaultId, Optional query, Map additionalProperties) { + this.vaultId = vaultId; + this.query = query; + this.additionalProperties = additionalProperties; + } + + /** + * @return ID of the vault where data is being inserted + */ + @JsonProperty("vaultID") + public Optional getVaultId() { + return vaultId; + } + + /** + * @return Query to execute. + */ + @JsonProperty("query") + public Optional getQuery() { + return query; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1ExecuteQueryRequest && equalTo((V1ExecuteQueryRequest) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1ExecuteQueryRequest other) { + return vaultId.equals(other.vaultId) && query.equals(other.query); + } + + @Override + public int hashCode() { + return Objects.hash(this.vaultId, this.query); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional vaultId = Optional.empty(); + + private Optional query = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1ExecuteQueryRequest other) { + vaultId(other.getVaultId()); + query(other.getQuery()); + return this; + } + + /** + *

ID of the vault where data is being inserted

+ */ + @JsonSetter(value = "vaultID", nulls = Nulls.SKIP) + public Builder vaultId(Optional vaultId) { + this.vaultId = vaultId; + return this; + } + + public Builder vaultId(String vaultId) { + this.vaultId = Optional.ofNullable(vaultId); + return this; + } + + /** + *

Query to execute.

+ */ + @JsonSetter(value = "query", nulls = Nulls.SKIP) + public Builder query(Optional query) { + this.query = query; + return this; + } + + public Builder query(String query) { + this.query = Optional.ofNullable(query); + return this; + } + + public V1ExecuteQueryRequest build() { + return new V1ExecuteQueryRequest(vaultId, query, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowEnumUpdateType.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowEnumUpdateType.java new file mode 100644 index 00000000..d3c1cea0 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowEnumUpdateType.java @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum FlowEnumUpdateType { + UPDATE("UPDATE"), + + REPLACE("REPLACE"); + + private final String value; + + FlowEnumUpdateType(String value) { + this.value = value; + } + + @JsonValue + @Override + public String toString() { + return this.value; + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowTokenizeResponseObjectToken.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowTokenizeResponseObjectToken.java new file mode 100644 index 00000000..0edfd9a8 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/FlowTokenizeResponseObjectToken.java @@ -0,0 +1,188 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = FlowTokenizeResponseObjectToken.Builder.class) +public final class FlowTokenizeResponseObjectToken { + private final Optional tokenGroupName; + + private final Optional token; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private FlowTokenizeResponseObjectToken( + Optional tokenGroupName, + Optional token, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.tokenGroupName = tokenGroupName; + this.token = token; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token group Name + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Token value + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + /** + * @return Error if tokenization failed + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof FlowTokenizeResponseObjectToken && equalTo((FlowTokenizeResponseObjectToken) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(FlowTokenizeResponseObjectToken other) { + return tokenGroupName.equals(other.tokenGroupName) + && token.equals(other.token) + && error.equals(other.error) + && httpCode.equals(other.httpCode); + } + + @Override + public int hashCode() { + return Objects.hash(this.tokenGroupName, this.token, this.error, this.httpCode); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional tokenGroupName = Optional.empty(); + + private Optional token = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(FlowTokenizeResponseObjectToken other) { + tokenGroupName(other.getTokenGroupName()); + token(other.getToken()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

Token group Name

+ */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

Token value

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(String token) { + this.token = Optional.ofNullable(token); + return this; + } + + /** + *

Error if tokenization failed

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

HTTP status code of the response

+ */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + public FlowTokenizeResponseObjectToken build() { + return new FlowTokenizeResponseObjectToken(tokenGroupName, token, error, httpCode, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/GoogleprotobufAny.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/GoogleprotobufAny.java new file mode 100644 index 00000000..06205978 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/GoogleprotobufAny.java @@ -0,0 +1,146 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = GoogleprotobufAny.Builder.class) +public final class GoogleprotobufAny { + private final Optional type; + + private final Map additionalProperties; + + private GoogleprotobufAny(Optional type, Map additionalProperties) { + this.type = type; + this.additionalProperties = additionalProperties; + } + + /** + * @return A URL/resource name that uniquely identifies the type of the serialized + * protocol buffer message. This string must contain at least + * one "/" character. The last segment of the URL's path must represent + * the fully qualified name of the type (as in + * path/google.protobuf.Duration). The name should be in a canonical form + * (e.g., leading "." is not accepted). + *

In practice, teams usually precompile into the binary all types that they + * expect it to use in the context of Any. However, for URLs which use the + * scheme http, https, or no scheme, one can optionally set up a type + * server that maps type URLs to message definitions as follows:

+ *
    + *
  • If no scheme is provided, https is assumed.
  • + *
  • An HTTP GET on the URL must yield a [google.protobuf.Type][] + * value in binary format, or produce an error.
  • + *
  • Applications are allowed to cache lookup results based on the + * URL, or have them precompiled into a binary to avoid any + * lookup. Therefore, binary compatibility needs to be preserved + * on changes to types. (Use versioned type names to manage + * breaking changes.)
  • + *
+ *

Note: this functionality is not currently available in the official + * protobuf release, and it is not used for type URLs beginning with + * type.googleapis.com. As of May 2023, there are no widely used type server + * implementations and no plans to implement one.

+ *

Schemes other than http, https (or the empty scheme) might be + * used with implementation specific semantics.

+ */ + @JsonProperty("@type") + public Optional getType() { + return type; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof GoogleprotobufAny && equalTo((GoogleprotobufAny) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(GoogleprotobufAny other) { + return type.equals(other.type); + } + + @Override + public int hashCode() { + return Objects.hash(this.type); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional type = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(GoogleprotobufAny other) { + type(other.getType()); + return this; + } + + /** + *

A URL/resource name that uniquely identifies the type of the serialized + * protocol buffer message. This string must contain at least + * one "/" character. The last segment of the URL's path must represent + * the fully qualified name of the type (as in + * path/google.protobuf.Duration). The name should be in a canonical form + * (e.g., leading "." is not accepted).

+ *

In practice, teams usually precompile into the binary all types that they + * expect it to use in the context of Any. However, for URLs which use the + * scheme http, https, or no scheme, one can optionally set up a type + * server that maps type URLs to message definitions as follows:

+ *
    + *
  • If no scheme is provided, https is assumed.
  • + *
  • An HTTP GET on the URL must yield a [google.protobuf.Type][] + * value in binary format, or produce an error.
  • + *
  • Applications are allowed to cache lookup results based on the + * URL, or have them precompiled into a binary to avoid any + * lookup. Therefore, binary compatibility needs to be preserved + * on changes to types. (Use versioned type names to manage + * breaking changes.)
  • + *
+ *

Note: this functionality is not currently available in the official + * protobuf release, and it is not used for type URLs beginning with + * type.googleapis.com. As of May 2023, there are no widely used type server + * implementations and no plans to implement one.

+ *

Schemes other than http, https (or the empty scheme) might be + * used with implementation specific semantics.

+ */ + @JsonSetter(value = "@type", nulls = Nulls.SKIP) + public Builder type(Optional type) { + this.type = type; + return this; + } + + public Builder type(String type) { + this.type = Optional.ofNullable(type); + return this; + } + + public GoogleprotobufAny build() { + return new GoogleprotobufAny(type, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/RpcStatus.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/RpcStatus.java new file mode 100644 index 00000000..347ce5c4 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/RpcStatus.java @@ -0,0 +1,135 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = RpcStatus.Builder.class) +public final class RpcStatus { + private final Optional code; + + private final Optional message; + + private final Optional> details; + + private final Map additionalProperties; + + private RpcStatus( + Optional code, + Optional message, + Optional> details, + Map additionalProperties) { + this.code = code; + this.message = message; + this.details = details; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("code") + public Optional getCode() { + return code; + } + + @JsonProperty("message") + public Optional getMessage() { + return message; + } + + @JsonProperty("details") + public Optional> getDetails() { + return details; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof RpcStatus && equalTo((RpcStatus) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(RpcStatus other) { + return code.equals(other.code) && message.equals(other.message) && details.equals(other.details); + } + + @Override + public int hashCode() { + return Objects.hash(this.code, this.message, this.details); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional code = Optional.empty(); + + private Optional message = Optional.empty(); + + private Optional> details = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(RpcStatus other) { + code(other.getCode()); + message(other.getMessage()); + details(other.getDetails()); + return this; + } + + @JsonSetter(value = "code", nulls = Nulls.SKIP) + public Builder code(Optional code) { + this.code = code; + return this; + } + + public Builder code(Integer code) { + this.code = Optional.ofNullable(code); + return this; + } + + @JsonSetter(value = "message", nulls = Nulls.SKIP) + public Builder message(Optional message) { + this.message = message; + return this; + } + + public Builder message(String message) { + this.message = Optional.ofNullable(message); + return this; + } + + @JsonSetter(value = "details", nulls = Nulls.SKIP) + public Builder details(Optional> details) { + this.details = details; + return this; + } + + public Builder details(List details) { + this.details = Optional.ofNullable(details); + return this; + } + + public RpcStatus build() { + return new RpcStatus(code, message, details, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ColumnRedactions.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ColumnRedactions.java new file mode 100644 index 00000000..b467a8c0 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ColumnRedactions.java @@ -0,0 +1,125 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1ColumnRedactions.Builder.class) +public final class V1ColumnRedactions { + private final Optional columnName; + + private final Optional redaction; + + private final Map additionalProperties; + + private V1ColumnRedactions( + Optional columnName, Optional redaction, Map additionalProperties) { + this.columnName = columnName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the column to be redacted + */ + @JsonProperty("columnName") + public Optional getColumnName() { + return columnName; + } + + /** + * @return Name of the redaction. Eg: plain_text, redacted, mask1 + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1ColumnRedactions && equalTo((V1ColumnRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1ColumnRedactions other) { + return columnName.equals(other.columnName) && redaction.equals(other.redaction); + } + + @Override + public int hashCode() { + return Objects.hash(this.columnName, this.redaction); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional columnName = Optional.empty(); + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1ColumnRedactions other) { + columnName(other.getColumnName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

Name of the column to be redacted

+ */ + @JsonSetter(value = "columnName", nulls = Nulls.SKIP) + public Builder columnName(Optional columnName) { + this.columnName = columnName; + return this; + } + + public Builder columnName(String columnName) { + this.columnName = Optional.ofNullable(columnName); + return this; + } + + /** + *

Name of the redaction. Eg: plain_text, redacted, mask1

+ */ + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public Builder redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + public Builder redaction(String redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + public V1ColumnRedactions build() { + return new V1ColumnRedactions(columnName, redaction, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponse.java new file mode 100644 index 00000000..24bd865d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponse.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DeleteResponse.Builder.class) +public final class V1DeleteResponse { + private final Optional> records; + + private final Map additionalProperties; + + private V1DeleteResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of deleted records with skyflow ID and any partial errors. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DeleteResponse && equalTo((V1DeleteResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DeleteResponse other) { + return records.equals(other.records); + } + + @Override + public int hashCode() { + return Objects.hash(this.records); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DeleteResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

List of deleted records with skyflow ID and any partial errors.

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public V1DeleteResponse build() { + return new V1DeleteResponse(records, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponseObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponseObject.java new file mode 100644 index 00000000..087ce4c7 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteResponseObject.java @@ -0,0 +1,156 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DeleteResponseObject.Builder.class) +public final class V1DeleteResponseObject { + private final Optional skyflowId; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private V1DeleteResponseObject( + Optional skyflowId, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID for the deleted record + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Partial Error message if any + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DeleteResponseObject && equalTo((V1DeleteResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DeleteResponseObject other) { + return skyflowId.equals(other.skyflowId) && error.equals(other.error) && httpCode.equals(other.httpCode); + } + + @Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.error, this.httpCode); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional skyflowId = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DeleteResponseObject other) { + skyflowId(other.getSkyflowId()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

Skyflow ID for the deleted record

+ */ + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public Builder skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + public Builder skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

Partial Error message if any

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

HTTP status code of the response

+ */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + public V1DeleteResponseObject build() { + return new V1DeleteResponseObject(skyflowId, error, httpCode, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteTokenResponseObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteTokenResponseObject.java new file mode 100644 index 00000000..f2e1dacd --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1DeleteTokenResponseObject.java @@ -0,0 +1,156 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1DeleteTokenResponseObject.Builder.class) +public final class V1DeleteTokenResponseObject { + private final Optional value; + + private final Optional error; + + private final Optional httpCode; + + private final Map additionalProperties; + + private V1DeleteTokenResponseObject( + Optional value, + Optional error, + Optional httpCode, + Map additionalProperties) { + this.value = value; + this.error = error; + this.httpCode = httpCode; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token value + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Error if deletion failed + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1DeleteTokenResponseObject && equalTo((V1DeleteTokenResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1DeleteTokenResponseObject other) { + return value.equals(other.value) && error.equals(other.error) && httpCode.equals(other.httpCode); + } + + @Override + public int hashCode() { + return Objects.hash(this.value, this.error, this.httpCode); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional value = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1DeleteTokenResponseObject other) { + value(other.getValue()); + error(other.getError()); + httpCode(other.getHttpCode()); + return this; + } + + /** + *

Token value

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(String value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

Error if deletion failed

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

HTTP status code of the response

+ */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + public V1DeleteTokenResponseObject build() { + return new V1DeleteTokenResponseObject(value, error, httpCode, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryRecordResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryRecordResponse.java new file mode 100644 index 00000000..9de3418b --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryRecordResponse.java @@ -0,0 +1,96 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1ExecuteQueryRecordResponse.Builder.class) +public final class V1ExecuteQueryRecordResponse { + private final Optional> data; + + private final Map additionalProperties; + + private V1ExecuteQueryRecordResponse(Optional> data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}. + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1ExecuteQueryRecordResponse && equalTo((V1ExecuteQueryRecordResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1ExecuteQueryRecordResponse other) { + return data.equals(other.data); + } + + @Override + public int hashCode() { + return Objects.hash(this.data); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1ExecuteQueryRecordResponse other) { + data(other.getData()); + return this; + } + + /** + *

Fields and values for the record. For example, {'field_1':'value_1', 'field_2':'value_2'}.

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + public V1ExecuteQueryRecordResponse build() { + return new V1ExecuteQueryRecordResponse(data, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponse.java new file mode 100644 index 00000000..f80b54e0 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponse.java @@ -0,0 +1,118 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1ExecuteQueryResponse.Builder.class) +public final class V1ExecuteQueryResponse { + private final Optional> records; + + private final Optional metadata; + + private final Map additionalProperties; + + private V1ExecuteQueryResponse( + Optional> records, + Optional metadata, + Map additionalProperties) { + this.records = records; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Records corresponding to the specified query. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @JsonProperty("metadata") + public Optional getMetadata() { + return metadata; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1ExecuteQueryResponse && equalTo((V1ExecuteQueryResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1ExecuteQueryResponse other) { + return records.equals(other.records) && metadata.equals(other.metadata); + } + + @Override + public int hashCode() { + return Objects.hash(this.records, this.metadata); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + private Optional metadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1ExecuteQueryResponse other) { + records(other.getRecords()); + metadata(other.getMetadata()); + return this; + } + + /** + *

Records corresponding to the specified query.

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public Builder metadata(Optional metadata) { + this.metadata = metadata; + return this; + } + + public Builder metadata(V1ExecuteQueryResponseMetadata metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + public V1ExecuteQueryResponse build() { + return new V1ExecuteQueryResponse(records, metadata, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponseMetadata.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponseMetadata.java new file mode 100644 index 00000000..c23da3bd --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1ExecuteQueryResponseMetadata.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1ExecuteQueryResponseMetadata.Builder.class) +public final class V1ExecuteQueryResponseMetadata { + private final Optional> columns; + + private final Map additionalProperties; + + private V1ExecuteQueryResponseMetadata(Optional> columns, Map additionalProperties) { + this.columns = columns; + this.additionalProperties = additionalProperties; + } + + /** + * @return Return columns for the query + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1ExecuteQueryResponseMetadata && equalTo((V1ExecuteQueryResponseMetadata) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1ExecuteQueryResponseMetadata other) { + return columns.equals(other.columns); + } + + @Override + public int hashCode() { + return Objects.hash(this.columns); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> columns = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1ExecuteQueryResponseMetadata other) { + columns(other.getColumns()); + return this; + } + + /** + *

Return columns for the query

+ */ + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public Builder columns(Optional> columns) { + this.columns = columns; + return this; + } + + public Builder columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + public V1ExecuteQueryResponseMetadata build() { + return new V1ExecuteQueryResponseMetadata(columns, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDeleteTokenResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDeleteTokenResponse.java new file mode 100644 index 00000000..34ca245c --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDeleteTokenResponse.java @@ -0,0 +1,94 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowDeleteTokenResponse.Builder.class) +public final class V1FlowDeleteTokenResponse { + private final Optional> tokens; + + private final Map additionalProperties; + + private V1FlowDeleteTokenResponse( + Optional> tokens, Map additionalProperties) { + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokens data for Delete + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowDeleteTokenResponse && equalTo((V1FlowDeleteTokenResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowDeleteTokenResponse other) { + return tokens.equals(other.tokens); + } + + @Override + public int hashCode() { + return Objects.hash(this.tokens); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> tokens = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowDeleteTokenResponse other) { + tokens(other.getTokens()); + return this; + } + + /** + *

Tokens data for Delete

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(List tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + public V1FlowDeleteTokenResponse build() { + return new V1FlowDeleteTokenResponse(tokens, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponse.java new file mode 100644 index 00000000..defe1dad --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponse.java @@ -0,0 +1,94 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowDetokenizeResponse.Builder.class) +public final class V1FlowDetokenizeResponse { + private final Optional> response; + + private final Map additionalProperties; + + private V1FlowDetokenizeResponse( + Optional> response, Map additionalProperties) { + this.response = response; + this.additionalProperties = additionalProperties; + } + + /** + * @return Detokenized data + */ + @JsonProperty("response") + public Optional> getResponse() { + return response; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowDetokenizeResponse && equalTo((V1FlowDetokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowDetokenizeResponse other) { + return response.equals(other.response); + } + + @Override + public int hashCode() { + return Objects.hash(this.response); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> response = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowDetokenizeResponse other) { + response(other.getResponse()); + return this; + } + + /** + *

Detokenized data

+ */ + @JsonSetter(value = "response", nulls = Nulls.SKIP) + public Builder response(Optional> response) { + this.response = response; + return this; + } + + public Builder response(List response) { + this.response = Optional.ofNullable(response); + return this; + } + + public V1FlowDetokenizeResponse build() { + return new V1FlowDetokenizeResponse(response, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponseObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponseObject.java new file mode 100644 index 00000000..f0cf909d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowDetokenizeResponseObject.java @@ -0,0 +1,249 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowDetokenizeResponseObject.Builder.class) +public final class V1FlowDetokenizeResponseObject { + private final Optional token; + + private final Optional value; + + private final Optional tokenGroupName; + + private final Optional error; + + private final Optional httpCode; + + private final Optional> metadata; + + private final Map additionalProperties; + + private V1FlowDetokenizeResponseObject( + Optional token, + Optional value, + Optional tokenGroupName, + Optional error, + Optional httpCode, + Optional> metadata, + Map additionalProperties) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.httpCode = httpCode; + this.metadata = metadata; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token to be detokenized + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + /** + * @return Detokenized value for the token + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Token group name + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Error if detokenization failed + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + /** + * @return Additional metadata associated with the token, such as tableName or skyflowID + */ + @JsonProperty("metadata") + public Optional> getMetadata() { + return metadata; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowDetokenizeResponseObject && equalTo((V1FlowDetokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowDetokenizeResponseObject other) { + return token.equals(other.token) + && value.equals(other.value) + && tokenGroupName.equals(other.tokenGroupName) + && error.equals(other.error) + && httpCode.equals(other.httpCode) + && metadata.equals(other.metadata); + } + + @Override + public int hashCode() { + return Objects.hash(this.token, this.value, this.tokenGroupName, this.error, this.httpCode, this.metadata); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional token = Optional.empty(); + + private Optional value = Optional.empty(); + + private Optional tokenGroupName = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + private Optional> metadata = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowDetokenizeResponseObject other) { + token(other.getToken()); + value(other.getValue()); + tokenGroupName(other.getTokenGroupName()); + error(other.getError()); + httpCode(other.getHttpCode()); + metadata(other.getMetadata()); + return this; + } + + /** + *

Token to be detokenized

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(String token) { + this.token = Optional.ofNullable(token); + return this; + } + + /** + *

Detokenized value for the token

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(Object value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

Token group name

+ */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

Error if detokenization failed

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

HTTP status code of the response

+ */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

Additional metadata associated with the token, such as tableName or skyflowID

+ */ + @JsonSetter(value = "metadata", nulls = Nulls.SKIP) + public Builder metadata(Optional> metadata) { + this.metadata = metadata; + return this; + } + + public Builder metadata(Map metadata) { + this.metadata = Optional.ofNullable(metadata); + return this; + } + + public V1FlowDetokenizeResponseObject build() { + return new V1FlowDetokenizeResponseObject( + token, value, tokenGroupName, error, httpCode, metadata, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeRequestObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeRequestObject.java new file mode 100644 index 00000000..adefcaed --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeRequestObject.java @@ -0,0 +1,153 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowTokenizeRequestObject.Builder.class) +public final class V1FlowTokenizeRequestObject { + private final Optional value; + + private final Optional> tokenGroupNames; + + private final Optional token; + + private final Map additionalProperties; + + private V1FlowTokenizeRequestObject( + Optional value, + Optional> tokenGroupNames, + Optional token, + Map additionalProperties) { + this.value = value; + this.tokenGroupNames = tokenGroupNames; + this.token = token; + this.additionalProperties = additionalProperties; + } + + /** + * @return Token Value + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return List of token group names + */ + @JsonProperty("tokenGroupNames") + public Optional> getTokenGroupNames() { + return tokenGroupNames; + } + + /** + * @return Token for the value, in case of BYOT. + */ + @JsonProperty("token") + public Optional getToken() { + return token; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowTokenizeRequestObject && equalTo((V1FlowTokenizeRequestObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowTokenizeRequestObject other) { + return value.equals(other.value) && tokenGroupNames.equals(other.tokenGroupNames) && token.equals(other.token); + } + + @Override + public int hashCode() { + return Objects.hash(this.value, this.tokenGroupNames, this.token); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional value = Optional.empty(); + + private Optional> tokenGroupNames = Optional.empty(); + + private Optional token = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowTokenizeRequestObject other) { + value(other.getValue()); + tokenGroupNames(other.getTokenGroupNames()); + token(other.getToken()); + return this; + } + + /** + *

Token Value

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(Object value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

List of token group names

+ */ + @JsonSetter(value = "tokenGroupNames", nulls = Nulls.SKIP) + public Builder tokenGroupNames(Optional> tokenGroupNames) { + this.tokenGroupNames = tokenGroupNames; + return this; + } + + public Builder tokenGroupNames(List tokenGroupNames) { + this.tokenGroupNames = Optional.ofNullable(tokenGroupNames); + return this; + } + + /** + *

Token for the value, in case of BYOT.

+ */ + @JsonSetter(value = "token", nulls = Nulls.SKIP) + public Builder token(Optional token) { + this.token = token; + return this; + } + + public Builder token(Object token) { + this.token = Optional.ofNullable(token); + return this; + } + + public V1FlowTokenizeRequestObject build() { + return new V1FlowTokenizeRequestObject(value, tokenGroupNames, token, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponse.java new file mode 100644 index 00000000..cf071b86 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponse.java @@ -0,0 +1,94 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowTokenizeResponse.Builder.class) +public final class V1FlowTokenizeResponse { + private final Optional> response; + + private final Map additionalProperties; + + private V1FlowTokenizeResponse( + Optional> response, Map additionalProperties) { + this.response = response; + this.additionalProperties = additionalProperties; + } + + /** + * @return Tokenized data + */ + @JsonProperty("response") + public Optional> getResponse() { + return response; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowTokenizeResponse && equalTo((V1FlowTokenizeResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowTokenizeResponse other) { + return response.equals(other.response); + } + + @Override + public int hashCode() { + return Objects.hash(this.response); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> response = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowTokenizeResponse other) { + response(other.getResponse()); + return this; + } + + /** + *

Tokenized data

+ */ + @JsonSetter(value = "response", nulls = Nulls.SKIP) + public Builder response(Optional> response) { + this.response = response; + return this; + } + + public Builder response(List response) { + this.response = Optional.ofNullable(response); + return this; + } + + public V1FlowTokenizeResponse build() { + return new V1FlowTokenizeResponse(response, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponseObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponseObject.java new file mode 100644 index 00000000..eb4a15ac --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowTokenizeResponseObject.java @@ -0,0 +1,124 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowTokenizeResponseObject.Builder.class) +public final class V1FlowTokenizeResponseObject { + private final Optional value; + + private final Optional> tokens; + + private final Map additionalProperties; + + private V1FlowTokenizeResponseObject( + Optional value, + Optional> tokens, + Map additionalProperties) { + this.value = value; + this.tokens = tokens; + this.additionalProperties = additionalProperties; + } + + /** + * @return Value of token + */ + @JsonProperty("value") + public Optional getValue() { + return value; + } + + /** + * @return Token value + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowTokenizeResponseObject && equalTo((V1FlowTokenizeResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowTokenizeResponseObject other) { + return value.equals(other.value) && tokens.equals(other.tokens); + } + + @Override + public int hashCode() { + return Objects.hash(this.value, this.tokens); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional value = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowTokenizeResponseObject other) { + value(other.getValue()); + tokens(other.getTokens()); + return this; + } + + /** + *

Value of token

+ */ + @JsonSetter(value = "value", nulls = Nulls.SKIP) + public Builder value(Optional value) { + this.value = value; + return this; + } + + public Builder value(Object value) { + this.value = Optional.ofNullable(value); + return this; + } + + /** + *

Token value

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(List tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + public V1FlowTokenizeResponseObject build() { + return new V1FlowTokenizeResponseObject(value, tokens, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsData.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsData.java new file mode 100644 index 00000000..5345de38 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsData.java @@ -0,0 +1,96 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowVaultMetricsData.Builder.class) +public final class V1FlowVaultMetricsData { + private final Optional> tables; + + private final Map additionalProperties; + + private V1FlowVaultMetricsData(Optional> tables, Map additionalProperties) { + this.tables = tables; + this.additionalProperties = additionalProperties; + } + + /** + * @return Map of table names to their metrics + */ + @JsonProperty("tables") + public Optional> getTables() { + return tables; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowVaultMetricsData && equalTo((V1FlowVaultMetricsData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowVaultMetricsData other) { + return tables.equals(other.tables); + } + + @Override + public int hashCode() { + return Objects.hash(this.tables); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> tables = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowVaultMetricsData other) { + tables(other.getTables()); + return this; + } + + /** + *

Map of table names to their metrics

+ */ + @JsonSetter(value = "tables", nulls = Nulls.SKIP) + public Builder tables(Optional> tables) { + this.tables = tables; + return this; + } + + public Builder tables(Map tables) { + this.tables = Optional.ofNullable(tables); + return this; + } + + public V1FlowVaultMetricsData build() { + return new V1FlowVaultMetricsData(tables, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsResponse.java new file mode 100644 index 00000000..f933bce5 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1FlowVaultMetricsResponse.java @@ -0,0 +1,121 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1FlowVaultMetricsResponse.Builder.class) +public final class V1FlowVaultMetricsResponse { + private final Optional data; + + private final Optional> error; + + private final Map additionalProperties; + + private V1FlowVaultMetricsResponse( + Optional data, + Optional> error, + Map additionalProperties) { + this.data = data; + this.error = error; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("data") + public Optional getData() { + return data; + } + + /** + * @return Error information, if any + */ + @JsonProperty("error") + public Optional> getError() { + return error; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1FlowVaultMetricsResponse && equalTo((V1FlowVaultMetricsResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1FlowVaultMetricsResponse other) { + return data.equals(other.data) && error.equals(other.error); + } + + @Override + public int hashCode() { + return Objects.hash(this.data, this.error); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional data = Optional.empty(); + + private Optional> error = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1FlowVaultMetricsResponse other) { + data(other.getData()); + error(other.getError()); + return this; + } + + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional data) { + this.data = data; + return this; + } + + public Builder data(V1FlowVaultMetricsData data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

Error information, if any

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional> error) { + this.error = error; + return this; + } + + public Builder error(Map error) { + this.error = Optional.ofNullable(error); + return this; + } + + public V1FlowVaultMetricsResponse build() { + return new V1FlowVaultMetricsResponse(data, error, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetRequestData.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetRequestData.java new file mode 100644 index 00000000..0c0cfab9 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetRequestData.java @@ -0,0 +1,216 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1GetRequestData.Builder.class) +public final class V1GetRequestData { + private final Optional tableName; + + private final Optional> skyflowIDs; + + private final Optional> columnRedactions; + + private final Optional> columns; + + private final Optional> uniqueValues; + + private final Map additionalProperties; + + private V1GetRequestData( + Optional tableName, + Optional> skyflowIDs, + Optional> columnRedactions, + Optional> columns, + Optional> uniqueValues, + Map additionalProperties) { + this.tableName = tableName; + this.skyflowIDs = skyflowIDs; + this.columnRedactions = columnRedactions; + this.columns = columns; + this.uniqueValues = uniqueValues; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the table where data is being fetched + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + /** + * @return Skyflow ID for the record to be fetched + */ + @JsonProperty("skyflowIDs") + public Optional> getSkyflowIDs() { + return skyflowIDs; + } + + /** + * @return List of columns to be redacted. + */ + @JsonProperty("columnRedactions") + public Optional> getColumnRedactions() { + return columnRedactions; + } + + /** + * @return List of columns to be fetched. + */ + @JsonProperty("columns") + public Optional> getColumns() { + return columns; + } + + /** + * @return List of unique constraint values to query records by data + */ + @JsonProperty("uniqueValues") + public Optional> getUniqueValues() { + return uniqueValues; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1GetRequestData && equalTo((V1GetRequestData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1GetRequestData other) { + return tableName.equals(other.tableName) + && skyflowIDs.equals(other.skyflowIDs) + && columnRedactions.equals(other.columnRedactions) + && columns.equals(other.columns) + && uniqueValues.equals(other.uniqueValues); + } + + @Override + public int hashCode() { + return Objects.hash(this.tableName, this.skyflowIDs, this.columnRedactions, this.columns, this.uniqueValues); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional tableName = Optional.empty(); + + private Optional> skyflowIDs = Optional.empty(); + + private Optional> columnRedactions = Optional.empty(); + + private Optional> columns = Optional.empty(); + + private Optional> uniqueValues = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1GetRequestData other) { + tableName(other.getTableName()); + skyflowIDs(other.getSkyflowIDs()); + columnRedactions(other.getColumnRedactions()); + columns(other.getColumns()); + uniqueValues(other.getUniqueValues()); + return this; + } + + /** + *

Name of the table where data is being fetched

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + /** + *

Skyflow ID for the record to be fetched

+ */ + @JsonSetter(value = "skyflowIDs", nulls = Nulls.SKIP) + public Builder skyflowIDs(Optional> skyflowIDs) { + this.skyflowIDs = skyflowIDs; + return this; + } + + public Builder skyflowIDs(List skyflowIDs) { + this.skyflowIDs = Optional.ofNullable(skyflowIDs); + return this; + } + + /** + *

List of columns to be redacted.

+ */ + @JsonSetter(value = "columnRedactions", nulls = Nulls.SKIP) + public Builder columnRedactions(Optional> columnRedactions) { + this.columnRedactions = columnRedactions; + return this; + } + + public Builder columnRedactions(List columnRedactions) { + this.columnRedactions = Optional.ofNullable(columnRedactions); + return this; + } + + /** + *

List of columns to be fetched.

+ */ + @JsonSetter(value = "columns", nulls = Nulls.SKIP) + public Builder columns(Optional> columns) { + this.columns = columns; + return this; + } + + public Builder columns(List columns) { + this.columns = Optional.ofNullable(columns); + return this; + } + + /** + *

List of unique constraint values to query records by data

+ */ + @JsonSetter(value = "uniqueValues", nulls = Nulls.SKIP) + public Builder uniqueValues(Optional> uniqueValues) { + this.uniqueValues = uniqueValues; + return this; + } + + public Builder uniqueValues(List uniqueValues) { + this.uniqueValues = Optional.ofNullable(uniqueValues); + return this; + } + + public V1GetRequestData build() { + return new V1GetRequestData( + tableName, skyflowIDs, columnRedactions, columns, uniqueValues, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetResponse.java new file mode 100644 index 00000000..a64a7588 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1GetResponse.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1GetResponse.Builder.class) +public final class V1GetResponse { + private final Optional> records; + + private final Map additionalProperties; + + private V1GetResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of fetched records with skyflow ID, tokens, data, and any partial errors + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1GetResponse && equalTo((V1GetResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1GetResponse other) { + return records.equals(other.records); + } + + @Override + public int hashCode() { + return Objects.hash(this.records); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1GetResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

List of fetched records with skyflow ID, tokens, data, and any partial errors

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public V1GetResponse build() { + return new V1GetResponse(records, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordData.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordData.java new file mode 100644 index 00000000..7de162cc --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordData.java @@ -0,0 +1,182 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1InsertRecordData.Builder.class) +public final class V1InsertRecordData { + private final Optional> data; + + private final Optional> tokens; + + private final Optional tableName; + + private final Optional upsert; + + private final Map additionalProperties; + + private V1InsertRecordData( + Optional> data, + Optional> tokens, + Optional tableName, + Optional upsert, + Map additionalProperties) { + this.data = data; + this.tokens = tokens; + this.tableName = tableName; + this.upsert = upsert; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns names and values + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return undocumented_field; Tokens data for the columns if any + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Table name for the record + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @JsonProperty("upsert") + public Optional getUpsert() { + return upsert; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1InsertRecordData && equalTo((V1InsertRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1InsertRecordData other) { + return data.equals(other.data) + && tokens.equals(other.tokens) + && tableName.equals(other.tableName) + && upsert.equals(other.upsert); + } + + @Override + public int hashCode() { + return Objects.hash(this.data, this.tokens, this.tableName, this.upsert); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> data = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional tableName = Optional.empty(); + + private Optional upsert = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1InsertRecordData other) { + data(other.getData()); + tokens(other.getTokens()); + tableName(other.getTableName()); + upsert(other.getUpsert()); + return this; + } + + /** + *

Columns names and values

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

undocumented_field; Tokens data for the columns if any

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

Table name for the record

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + @JsonSetter(value = "upsert", nulls = Nulls.SKIP) + public Builder upsert(Optional upsert) { + this.upsert = upsert; + return this; + } + + public Builder upsert(V1Upsert upsert) { + this.upsert = Optional.ofNullable(upsert); + return this; + } + + public V1InsertRecordData build() { + return new V1InsertRecordData(data, tokens, tableName, upsert, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertResponse.java new file mode 100644 index 00000000..4ff3ff2d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1InsertResponse.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1InsertResponse.Builder.class) +public final class V1InsertResponse { + private final Optional> records; + + private final Map additionalProperties; + + private V1InsertResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of inserted records with skyflow ID, tokens, data, and any partial errors. + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1InsertResponse && equalTo((V1InsertResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1InsertResponse other) { + return records.equals(other.records); + } + + @Override + public int hashCode() { + return Objects.hash(this.records); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1InsertResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

List of inserted records with skyflow ID, tokens, data, and any partial errors.

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public V1InsertResponse build() { + return new V1InsertResponse(records, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1RecordResponseObject.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1RecordResponseObject.java new file mode 100644 index 00000000..b6c2467c --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1RecordResponseObject.java @@ -0,0 +1,280 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1RecordResponseObject.Builder.class) +public final class V1RecordResponseObject { + private final Optional skyflowId; + + private final Optional> tokens; + + private final Optional> data; + + private final Optional> hashedData; + + private final Optional error; + + private final Optional httpCode; + + private final Optional tableName; + + private final Map additionalProperties; + + private V1RecordResponseObject( + Optional skyflowId, + Optional> tokens, + Optional> data, + Optional> hashedData, + Optional error, + Optional httpCode, + Optional tableName, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.tokens = tokens; + this.data = data; + this.hashedData = hashedData; + this.error = error; + this.httpCode = httpCode; + this.tableName = tableName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID for the inserted record + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return Tokens data for the columns if any + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Columns names and values + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return Hashed Data for the columns if any + */ + @JsonProperty("hashedData") + public Optional> getHashedData() { + return hashedData; + } + + /** + * @return Partial Error message if any + */ + @JsonProperty("error") + public Optional getError() { + return error; + } + + /** + * @return HTTP status code of the response + */ + @JsonProperty("httpCode") + public Optional getHttpCode() { + return httpCode; + } + + /** + * @return Name of the table record belongs to + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1RecordResponseObject && equalTo((V1RecordResponseObject) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1RecordResponseObject other) { + return skyflowId.equals(other.skyflowId) + && tokens.equals(other.tokens) + && data.equals(other.data) + && hashedData.equals(other.hashedData) + && error.equals(other.error) + && httpCode.equals(other.httpCode) + && tableName.equals(other.tableName); + } + + @Override + public int hashCode() { + return Objects.hash( + this.skyflowId, this.tokens, this.data, this.hashedData, this.error, this.httpCode, this.tableName); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional skyflowId = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional> hashedData = Optional.empty(); + + private Optional error = Optional.empty(); + + private Optional httpCode = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1RecordResponseObject other) { + skyflowId(other.getSkyflowId()); + tokens(other.getTokens()); + data(other.getData()); + hashedData(other.getHashedData()); + error(other.getError()); + httpCode(other.getHttpCode()); + tableName(other.getTableName()); + return this; + } + + /** + *

Skyflow ID for the inserted record

+ */ + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public Builder skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + public Builder skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

Tokens data for the columns if any

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

Columns names and values

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

Hashed Data for the columns if any

+ */ + @JsonSetter(value = "hashedData", nulls = Nulls.SKIP) + public Builder hashedData(Optional> hashedData) { + this.hashedData = hashedData; + return this; + } + + public Builder hashedData(Map hashedData) { + this.hashedData = Optional.ofNullable(hashedData); + return this; + } + + /** + *

Partial Error message if any

+ */ + @JsonSetter(value = "error", nulls = Nulls.SKIP) + public Builder error(Optional error) { + this.error = error; + return this; + } + + public Builder error(String error) { + this.error = Optional.ofNullable(error); + return this; + } + + /** + *

HTTP status code of the response

+ */ + @JsonSetter(value = "httpCode", nulls = Nulls.SKIP) + public Builder httpCode(Optional httpCode) { + this.httpCode = httpCode; + return this; + } + + public Builder httpCode(Integer httpCode) { + this.httpCode = Optional.ofNullable(httpCode); + return this; + } + + /** + *

Name of the table record belongs to

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + public V1RecordResponseObject build() { + return new V1RecordResponseObject( + skyflowId, tokens, data, hashedData, error, httpCode, tableName, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1TokenGroupRedactions.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1TokenGroupRedactions.java new file mode 100644 index 00000000..5d5fc97f --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1TokenGroupRedactions.java @@ -0,0 +1,125 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1TokenGroupRedactions.Builder.class) +public final class V1TokenGroupRedactions { + private final Optional tokenGroupName; + + private final Optional redaction; + + private final Map additionalProperties; + + private V1TokenGroupRedactions( + Optional tokenGroupName, Optional redaction, Map additionalProperties) { + this.tokenGroupName = tokenGroupName; + this.redaction = redaction; + this.additionalProperties = additionalProperties; + } + + /** + * @return Name of the token group to be redacted + */ + @JsonProperty("tokenGroupName") + public Optional getTokenGroupName() { + return tokenGroupName; + } + + /** + * @return Name of the redaction. Eg: plain_text, redacted, mask1 + */ + @JsonProperty("redaction") + public Optional getRedaction() { + return redaction; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1TokenGroupRedactions && equalTo((V1TokenGroupRedactions) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1TokenGroupRedactions other) { + return tokenGroupName.equals(other.tokenGroupName) && redaction.equals(other.redaction); + } + + @Override + public int hashCode() { + return Objects.hash(this.tokenGroupName, this.redaction); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional tokenGroupName = Optional.empty(); + + private Optional redaction = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1TokenGroupRedactions other) { + tokenGroupName(other.getTokenGroupName()); + redaction(other.getRedaction()); + return this; + } + + /** + *

Name of the token group to be redacted

+ */ + @JsonSetter(value = "tokenGroupName", nulls = Nulls.SKIP) + public Builder tokenGroupName(Optional tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public Builder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = Optional.ofNullable(tokenGroupName); + return this; + } + + /** + *

Name of the redaction. Eg: plain_text, redacted, mask1

+ */ + @JsonSetter(value = "redaction", nulls = Nulls.SKIP) + public Builder redaction(Optional redaction) { + this.redaction = redaction; + return this; + } + + public Builder redaction(String redaction) { + this.redaction = Optional.ofNullable(redaction); + return this; + } + + public V1TokenGroupRedactions build() { + return new V1TokenGroupRedactions(tokenGroupName, redaction, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UniqueValue.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UniqueValue.java new file mode 100644 index 00000000..3b188c6d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UniqueValue.java @@ -0,0 +1,96 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1UniqueValue.Builder.class) +public final class V1UniqueValue { + private final Optional> data; + + private final Map additionalProperties; + + private V1UniqueValue(Optional> data, Map additionalProperties) { + this.data = data; + this.additionalProperties = additionalProperties; + } + + /** + * @return Columns names and values for unique value entry + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1UniqueValue && equalTo((V1UniqueValue) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1UniqueValue other) { + return data.equals(other.data); + } + + @Override + public int hashCode() { + return Objects.hash(this.data); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> data = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1UniqueValue other) { + data(other.getData()); + return this; + } + + /** + *

Columns names and values for unique value entry

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + public V1UniqueValue build() { + return new V1UniqueValue(data, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordData.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordData.java new file mode 100644 index 00000000..5a904005 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordData.java @@ -0,0 +1,188 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1UpdateRecordData.Builder.class) +public final class V1UpdateRecordData { + private final Optional skyflowId; + + private final Optional> data; + + private final Optional> tokens; + + private final Optional tableName; + + private final Map additionalProperties; + + private V1UpdateRecordData( + Optional skyflowId, + Optional> data, + Optional> tokens, + Optional tableName, + Map additionalProperties) { + this.skyflowId = skyflowId; + this.data = data; + this.tokens = tokens; + this.tableName = tableName; + this.additionalProperties = additionalProperties; + } + + /** + * @return Skyflow ID for the record to be updated + */ + @JsonProperty("skyflowID") + public Optional getSkyflowId() { + return skyflowId; + } + + /** + * @return List of data row wise that is to be updated in the vault + */ + @JsonProperty("data") + public Optional> getData() { + return data; + } + + /** + * @return undocumented_field; Tokens data for the columns if any + */ + @JsonProperty("tokens") + public Optional> getTokens() { + return tokens; + } + + /** + * @return Table name for the record + */ + @JsonProperty("tableName") + public Optional getTableName() { + return tableName; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1UpdateRecordData && equalTo((V1UpdateRecordData) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1UpdateRecordData other) { + return skyflowId.equals(other.skyflowId) + && data.equals(other.data) + && tokens.equals(other.tokens) + && tableName.equals(other.tableName); + } + + @Override + public int hashCode() { + return Objects.hash(this.skyflowId, this.data, this.tokens, this.tableName); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional skyflowId = Optional.empty(); + + private Optional> data = Optional.empty(); + + private Optional> tokens = Optional.empty(); + + private Optional tableName = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1UpdateRecordData other) { + skyflowId(other.getSkyflowId()); + data(other.getData()); + tokens(other.getTokens()); + tableName(other.getTableName()); + return this; + } + + /** + *

Skyflow ID for the record to be updated

+ */ + @JsonSetter(value = "skyflowID", nulls = Nulls.SKIP) + public Builder skyflowId(Optional skyflowId) { + this.skyflowId = skyflowId; + return this; + } + + public Builder skyflowId(String skyflowId) { + this.skyflowId = Optional.ofNullable(skyflowId); + return this; + } + + /** + *

List of data row wise that is to be updated in the vault

+ */ + @JsonSetter(value = "data", nulls = Nulls.SKIP) + public Builder data(Optional> data) { + this.data = data; + return this; + } + + public Builder data(Map data) { + this.data = Optional.ofNullable(data); + return this; + } + + /** + *

undocumented_field; Tokens data for the columns if any

+ */ + @JsonSetter(value = "tokens", nulls = Nulls.SKIP) + public Builder tokens(Optional> tokens) { + this.tokens = tokens; + return this; + } + + public Builder tokens(Map tokens) { + this.tokens = Optional.ofNullable(tokens); + return this; + } + + /** + *

Table name for the record

+ */ + @JsonSetter(value = "tableName", nulls = Nulls.SKIP) + public Builder tableName(Optional tableName) { + this.tableName = tableName; + return this; + } + + public Builder tableName(String tableName) { + this.tableName = Optional.ofNullable(tableName); + return this; + } + + public V1UpdateRecordData build() { + return new V1UpdateRecordData(skyflowId, data, tokens, tableName, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateResponse.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateResponse.java new file mode 100644 index 00000000..38dfe0ab --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1UpdateResponse.java @@ -0,0 +1,93 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1UpdateResponse.Builder.class) +public final class V1UpdateResponse { + private final Optional> records; + + private final Map additionalProperties; + + private V1UpdateResponse(Optional> records, Map additionalProperties) { + this.records = records; + this.additionalProperties = additionalProperties; + } + + /** + * @return List of updated records with skyflow ID, tokens, data, and any partial errors + */ + @JsonProperty("records") + public Optional> getRecords() { + return records; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1UpdateResponse && equalTo((V1UpdateResponse) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1UpdateResponse other) { + return records.equals(other.records); + } + + @Override + public int hashCode() { + return Objects.hash(this.records); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional> records = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1UpdateResponse other) { + records(other.getRecords()); + return this; + } + + /** + *

List of updated records with skyflow ID, tokens, data, and any partial errors

+ */ + @JsonSetter(value = "records", nulls = Nulls.SKIP) + public Builder records(Optional> records) { + this.records = records; + return this; + } + + public Builder records(List records) { + this.records = Optional.ofNullable(records); + return this; + } + + public V1UpdateResponse build() { + return new V1UpdateResponse(records, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/generated/rest/types/V1Upsert.java b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1Upsert.java new file mode 100644 index 00000000..a0c27b0e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/generated/rest/types/V1Upsert.java @@ -0,0 +1,118 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.types; + +import com.fasterxml.jackson.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.skyflow.generated.rest.core.ObjectMappers; + +import java.util.*; + +@JsonInclude(JsonInclude.Include.NON_ABSENT) +@JsonDeserialize(builder = V1Upsert.Builder.class) +public final class V1Upsert { + private final Optional updateType; + + private final Optional> uniqueColumns; + + private final Map additionalProperties; + + private V1Upsert( + Optional updateType, + Optional> uniqueColumns, + Map additionalProperties) { + this.updateType = updateType; + this.uniqueColumns = uniqueColumns; + this.additionalProperties = additionalProperties; + } + + @JsonProperty("updateType") + public Optional getUpdateType() { + return updateType; + } + + /** + * @return Name of a unique columns in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record. + */ + @JsonProperty("uniqueColumns") + public Optional> getUniqueColumns() { + return uniqueColumns; + } + + @Override + public boolean equals(Object other) { + if (this == other) return true; + return other instanceof V1Upsert && equalTo((V1Upsert) other); + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + private boolean equalTo(V1Upsert other) { + return updateType.equals(other.updateType) && uniqueColumns.equals(other.uniqueColumns); + } + + @Override + public int hashCode() { + return Objects.hash(this.updateType, this.uniqueColumns); + } + + @Override + public String toString() { + return ObjectMappers.stringify(this); + } + + public static Builder builder() { + return new Builder(); + } + + @JsonIgnoreProperties(ignoreUnknown = true) + public static final class Builder { + private Optional updateType = Optional.empty(); + + private Optional> uniqueColumns = Optional.empty(); + + @JsonAnySetter + private Map additionalProperties = new HashMap<>(); + + private Builder() {} + + public Builder from(V1Upsert other) { + updateType(other.getUpdateType()); + uniqueColumns(other.getUniqueColumns()); + return this; + } + + @JsonSetter(value = "updateType", nulls = Nulls.SKIP) + public Builder updateType(Optional updateType) { + this.updateType = updateType; + return this; + } + + public Builder updateType(FlowEnumUpdateType updateType) { + this.updateType = Optional.ofNullable(updateType); + return this; + } + + /** + *

Name of a unique columns in the table. Uses upsert operations to check if a record exists based on the unique column's value. If a matching record exists, the record updates with the values you provide. If a matching record doesn't exist, the upsert operation inserts a new record.

+ */ + @JsonSetter(value = "uniqueColumns", nulls = Nulls.SKIP) + public Builder uniqueColumns(Optional> uniqueColumns) { + this.uniqueColumns = uniqueColumns; + return this; + } + + public Builder uniqueColumns(List uniqueColumns) { + this.uniqueColumns = Optional.ofNullable(uniqueColumns); + return this; + } + + public V1Upsert build() { + return new V1Upsert(updateType, uniqueColumns, additionalProperties); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/utils/Constants.java b/flowvault/src/main/java/com/skyflow/utils/Constants.java new file mode 100644 index 00000000..983e82b3 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/utils/Constants.java @@ -0,0 +1,50 @@ +package com.skyflow.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public final class Constants extends BaseConstants { + public static final String SDK_NAME = "Skyflow Java SDK"; + public static final String SDK_VERSION; + public static final String VAULT_DOMAIN = ".skyvault."; + public static final String SDK_PREFIX; + public static final String SDK_METRIC_NAME_VERSION_PREFIX = "skyflow-flowvault-java@"; + public static final Integer INSERT_BATCH_SIZE = 50; + public static final Integer MAX_INSERT_BATCH_SIZE = 1000; + public static final Integer INSERT_CONCURRENCY_LIMIT = 1; + public static final Integer MAX_INSERT_CONCURRENCY_LIMIT = 10; + public static final Integer DETOKENIZE_BATCH_SIZE = 50; + public static final Integer DETOKENIZE_CONCURRENCY_LIMIT = 1; + public static final Integer MAX_DETOKENIZE_BATCH_SIZE = 1000; + public static final Integer MAX_DETOKENIZE_CONCURRENCY_LIMIT = 10; + public static final Integer DELETE_TOKENS_BATCH_SIZE = 50; + public static final Integer DELETE_TOKENS_CONCURRENCY_LIMIT = 1; + public static final Integer MAX_DELETE_TOKENS_BATCH_SIZE = 1000; + public static final Integer MAX_DELETE_TOKENS_CONCURRENCY_LIMIT = 10; + public static final Integer TOKENIZE_BATCH_SIZE = 50; + public static final Integer TOKENIZE_CONCURRENCY_LIMIT = 1; + public static final Integer MAX_TOKENIZE_BATCH_SIZE = 1000; + public static final Integer MAX_TOKENIZE_CONCURRENCY_LIMIT = 10; + public static final String DEFAULT_SDK_VERSION = "v3"; + public static final String CONTEXT_KEY_REGEX = "^[a-zA-Z0-9_]+$"; + + static { + String sdkVersion; + // Use a static initializer block to read the properties file + Properties properties = new Properties(); + try (InputStream input = Constants.class.getClassLoader().getResourceAsStream("sdk.properties")) { + if (input == null) { + sdkVersion = DEFAULT_SDK_VERSION; + } else { + properties.load(input); + sdkVersion = properties.getProperty("sdk.version", DEFAULT_SDK_VERSION); + } + } catch (IOException ex) { + sdkVersion = DEFAULT_SDK_VERSION; + } + SDK_VERSION = sdkVersion; + SDK_PREFIX = SDK_NAME + " " + SDK_VERSION; + } + +} diff --git a/flowvault/src/main/java/com/skyflow/utils/Utils.java b/flowvault/src/main/java/com/skyflow/utils/Utils.java new file mode 100644 index 00000000..5880344b --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/utils/Utils.java @@ -0,0 +1,867 @@ +package com.skyflow.utils; + +import com.google.gson.JsonObject; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.Env; +import com.skyflow.enums.UpsertType; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest; +import com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest; +import com.skyflow.generated.rest.types.*; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.logs.WarningLogs; +import com.skyflow.serviceaccount.util.BearerToken; +import com.skyflow.serviceaccount.util.Token; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.vault.data.*; +import io.github.cdimascio.dotenv.Dotenv; +import io.github.cdimascio.dotenv.DotenvException; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class Utils extends BaseUtils { + + public static String getVaultURL(String clusterId, Env env) { + return getVaultURL(clusterId, env, Constants.VAULT_DOMAIN); + } + + public static JsonObject getMetrics() { + JsonObject details = getCommonMetrics(); + String sdkVersion = Constants.SDK_VERSION; + details.addProperty(Constants.SDK_METRIC_NAME_VERSION, Constants.SDK_METRIC_NAME_VERSION_PREFIX + sdkVersion); + return details; + } + + + public static String getEnvVaultURL() throws SkyflowException { + try { + String vaultURL = System.getenv("VAULT_URL"); + if (vaultURL == null) { + Dotenv dotenv = Dotenv.load(); + vaultURL = dotenv.get("VAULT_URL"); + } + if (vaultURL != null && vaultURL.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_VAULT_URL.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyVaultUrl.getMessage()); + } else if (vaultURL != null && !isValidURL(vaultURL)) { + LogUtil.printErrorLog(ErrorLogs.INVALID_VAULT_URL_FORMAT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidVaultUrlFormat.getMessage()); + } + return vaultURL; + } catch (DotenvException e) { + return null; + } + } + + public static boolean isValidURL(String url) { + URL parsedUrl; + try { + parsedUrl = new URL(url); + } catch (MalformedURLException e) { + return false; + } + + if (!parsedUrl.getProtocol().equalsIgnoreCase("https")) { + return false; + } else { + return parsedUrl.getHost() != null && !parsedUrl.getHost().isEmpty(); + } + } + + + public static String generateBearerToken(Credentials credentials) throws SkyflowException { + if (credentials.getPath() != null) { + BearerToken.BearerTokenBuilder builder = BearerToken.builder() + .setCredentials(new File(credentials.getPath())) + .setRoles(credentials.getRoles()); + Object ctx = credentials.getContext(); + if (ctx instanceof String) { + builder.setCtx((String) ctx); + } else if (ctx instanceof Map) { + builder.setCtx((Map) ctx); + } + return builder.build().getBearerToken(); + } else if (credentials.getCredentialsString() != null) { + BearerToken.BearerTokenBuilder builder = BearerToken.builder() + .setCredentials(credentials.getCredentialsString()) + .setRoles(credentials.getRoles()); + Object ctx = credentials.getContext(); + if (ctx instanceof String) { + builder.setCtx((String) ctx); + } else if (ctx instanceof Map) { + builder.setCtx((Map) ctx); + } + return builder.build().getBearerToken(); + } else { + return credentials.getToken(); + } + } + + public static V1InsertRequest getBulkInsertRequestBody(InsertRequest request, VaultConfig config) { + ArrayList records = request.getRecords(); + List insertRecordDataList = new ArrayList<>(); + for (InsertRecord record : records) { + V1InsertRecordData.Builder data = V1InsertRecordData.builder(); + data.data(record.getData()); + if (record.getTable() != null && !record.getTable().isEmpty()) { + data.tableName(record.getTable()); + } + if (record.getUpsert() != null && !record.getUpsert().isEmpty()) { + if (record.getUpsertType() != null) { + FlowEnumUpdateType updateType = null; + if (record.getUpsertType() == UpsertType.REPLACE) { + updateType = FlowEnumUpdateType.REPLACE; + } else if (record.getUpsertType() == UpsertType.UPDATE) { + updateType = FlowEnumUpdateType.UPDATE; + } + V1Upsert upsert = V1Upsert.builder().uniqueColumns(record.getUpsert()).updateType(updateType).build(); + data.upsert(upsert); + } else { + V1Upsert upsert = V1Upsert.builder().uniqueColumns(record.getUpsert()).build(); + data.upsert(upsert); + } + } + insertRecordDataList.add(data.build()); + } + + V1InsertRequest.Builder builder = V1InsertRequest.builder() + .vaultId(config.getVaultId()) + .records(insertRecordDataList); + + if (request.getTable() != null && !request.getTable().isEmpty()) { + builder.tableName(request.getTable()); + } + + if (request.getUpsert() != null && !request.getUpsert().isEmpty()) { + if (request.getUpsertType() != null) { + FlowEnumUpdateType updateType = null; + if (request.getUpsertType() == UpsertType.REPLACE) { + updateType = FlowEnumUpdateType.REPLACE; + } else if (request.getUpsertType() == UpsertType.UPDATE) { + updateType = FlowEnumUpdateType.UPDATE; + } + V1Upsert upsert = V1Upsert.builder().uniqueColumns(request.getUpsert()).updateType(updateType).build(); + builder.upsert(upsert); + } else { + V1Upsert upsert = V1Upsert.builder().uniqueColumns(request.getUpsert()).build(); + builder.upsert(upsert); + } + } + return builder.build(); + + } + + public static InsertResponse buildInsertResponse(V1InsertResponse res) { + ArrayList> insertedFields = new ArrayList<>(); + ArrayList> errors = new ArrayList<>(); + + if (res != null && res.getRecords().isPresent()) { + for (V1RecordResponseObject record : res.getRecords().get()) { + if (record.getError().isPresent()) { + HashMap errorRecord = new HashMap<>(); + record.getSkyflowId().ifPresent(skyflowId -> errorRecord.put("skyflowId", skyflowId)); + record.getTableName().ifPresent(tableName -> errorRecord.put("tableName", tableName)); + errorRecord.put("error", record.getError().get()); + record.getHttpCode().ifPresent(httpCode -> errorRecord.put("httpCode", httpCode)); + errors.add(errorRecord); + } else { + HashMap insertedRecord = new HashMap<>(); + record.getSkyflowId().ifPresent(skyflowId -> insertedRecord.put("skyflowId", skyflowId)); + record.getTokens().ifPresent(insertedRecord::putAll); + insertedFields.add(insertedRecord); + } + } + } + return new InsertResponse(insertedFields, errors); + } + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest getDetokenizeRequestBody(DetokenizeRequest request, String vaultid) { + List detokenizeData = request.getDetokenizeData(); + List tokens = new ArrayList<>(); + for(int i = 0; i< detokenizeData.size(); i++){ + tokens.add(detokenizeData.get(i).getToken()); + } + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest.Builder builder = + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest.builder() + .vaultId(vaultid) + .tokens(tokens); + if (request.getTokenGroupRedactions() != null) { + List tokenGroupRedactionsList = new ArrayList<>(); + for (com.skyflow.vault.data.TokenGroupRedactions tokenGroupRedactions : request.getTokenGroupRedactions()) { + com.skyflow.generated.rest.types.V1TokenGroupRedactions redactions = + com.skyflow.generated.rest.types.V1TokenGroupRedactions.builder() + .tokenGroupName(tokenGroupRedactions.getTokenGroupName()) + .redaction(tokenGroupRedactions.getRedaction()) + .build(); + tokenGroupRedactionsList.add(redactions); + } + + builder.tokenGroupRedactions(tokenGroupRedactionsList); + } + return builder.build(); + } + + public static DetokenizeResponse buildDetokenizeResponse(V1FlowDetokenizeResponse res) { + ArrayList detokenizedFields = new ArrayList<>(); + ArrayList errors = new ArrayList<>(); + + if (res != null && res.getResponse().isPresent()) { + for (V1FlowDetokenizeResponseObject record : res.getResponse().get()) { + String token = record.getToken().orElse(null); + String tokenGroupName = record.getTokenGroupName().orElse(null); + Map metadata = record.getMetadata().orElse(null); + if (record.getError().isPresent()) { + errors.add(new DetokenizeRecordResponse(token, null, record.getError().get(), tokenGroupName, metadata)); + } else { + Object value = record.getValue().orElse(null); + detokenizedFields.add(new DetokenizeRecordResponse(token, value, null, tokenGroupName, metadata)); + } + } + } + return new DetokenizeResponse(detokenizedFields, errors); + } + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest getDeleteTokensRequestBody(DeleteTokensRequest request, String vaultid) { + return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder() + .vaultId(vaultid) + .tokens(request.getTokens()) + .build(); + } + private static String extractRequestId(Map> headers) { + if (headers == null) return null; + List ids = headers.get(BaseConstants.REQUEST_ID_HEADER_KEY); + return (ids == null || ids.isEmpty()) ? null : ids.get(0); + } + + public static DeleteTokensResponse buildDeleteTokensResponse(V1FlowDeleteTokenResponse res, Map> headers, int requestedTokenCount) { + ArrayList deletedTokens = new ArrayList<>(); + ArrayList> errors = new ArrayList<>(); + String requestId = extractRequestId(headers); + if (res != null && res.getTokens().isPresent()) { + for (V1DeleteTokenResponseObject record : res.getTokens().get()) { + if (record.getError().isPresent()) { + HashMap errorRecord = new HashMap<>(); + errorRecord.put("error", record.getError().get()); + record.getHttpCode().ifPresent(httpCode -> errorRecord.put("httpCode", httpCode)); + errorRecord.put("requestId", requestId); + errors.add(errorRecord); + } else { + record.getValue().ifPresent(deletedTokens::add); + } + } + if (deletedTokens.size() + errors.size() != requestedTokenCount) { + LogUtil.printWarningLog(WarningLogs.INCOMPLETE_DELETE_TOKENS_RESPONSE.getLog()); + } + } else { + LogUtil.printWarningLog(WarningLogs.EMPTY_DELETE_TOKENS_RESPONSE.getLog()); + } + return new DeleteTokensResponse(deletedTokens, errors); + } + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest getTokenizeRequestBody(TokenizeRequest request, String vaultid) { + List dataList = new ArrayList<>(); + for (TokenizeRecord record : request.getData()) { + V1FlowTokenizeRequestObject obj = V1FlowTokenizeRequestObject.builder() + .value(record.getValue()) + .tokenGroupNames(record.getTokenGroupNames()) + .build(); + dataList.add(obj); + } + return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest.builder() + .vaultId(vaultid) + .data(dataList) + .build(); + } + + public static TokenizeResponse buildTokenizeResponse(V1FlowTokenizeResponse res, Map> headers, int requestedRecordCount) { + List tokenizedData = new ArrayList<>(); + ArrayList> errors = new ArrayList<>(); + String requestId = extractRequestId(headers); + if (res != null && res.getResponse().isPresent()) { + List records = res.getResponse().get(); + int indexNumber = 0; + for (V1FlowTokenizeResponseObject record : records) { + Object value = record.getValue().orElse(null); + TokenizeData tokenizeData = new TokenizeData(value, indexNumber); + boolean hasAnySuccess = false; + if (record.getTokens().isPresent()) { + for (FlowTokenizeResponseObjectToken tokenObj : record.getTokens().get()) { + if (tokenObj.getError().isPresent()) { + HashMap errorRecord = new HashMap<>(); + errorRecord.put("error", tokenObj.getError().get()); + tokenObj.getHttpCode().ifPresent(httpCode -> errorRecord.put("httpCode", httpCode)); + tokenObj.getTokenGroupName().ifPresent(name -> errorRecord.put("tokenGroupName", name)); + errorRecord.put("index", indexNumber); + errorRecord.put("requestId", requestId); + errors.add(errorRecord); + } else if (tokenObj.getTokenGroupName().isPresent() && tokenObj.getToken().isPresent()) { + tokenizeData.addToken(tokenObj.getTokenGroupName().get(), tokenObj.getToken().get()); + hasAnySuccess = true; + } + } + } + if (hasAnySuccess) { + tokenizedData.add(tokenizeData); + } + indexNumber++; + } + if (indexNumber != requestedRecordCount) { + LogUtil.printWarningLog(WarningLogs.INCOMPLETE_TOKENIZE_RESPONSE.getLog()); + } + } else { + LogUtil.printWarningLog(WarningLogs.EMPTY_TOKENIZE_RESPONSE.getLog()); + } + TokenizeResponse tokenizeResponse = new TokenizeResponse(errors); + tokenizeResponse.setTokenizedData(tokenizedData); + return tokenizeResponse; + } + + // ── Bulk (batched/concurrent) request-body builders ────────────────────── + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest getBulkInsertRequestBody(BulkInsertRequest request, VaultConfig config) { + ArrayList records = request.getRecords(); + List insertRecordDataList = new ArrayList<>(); + for (BulkInsertRecord record : records) { + V1InsertRecordData.Builder data = V1InsertRecordData.builder(); + data.data(record.getData()); + if (record.getTable() != null && !record.getTable().isEmpty()) { + data.tableName(record.getTable()); + } + if (record.getUpsert() != null && !record.getUpsert().isEmpty()) { + if (record.getUpsertType() != null) { + FlowEnumUpdateType updateType = null; + if (record.getUpsertType() == UpsertType.REPLACE) { + updateType = FlowEnumUpdateType.REPLACE; + } else if (record.getUpsertType() == UpsertType.UPDATE) { + updateType = FlowEnumUpdateType.UPDATE; + } + V1Upsert upsert = V1Upsert.builder().uniqueColumns(record.getUpsert()).updateType(updateType).build(); + data.upsert(upsert); + } else { + V1Upsert upsert = V1Upsert.builder().uniqueColumns(record.getUpsert()).build(); + data.upsert(upsert); + } + } + insertRecordDataList.add(data.build()); + } + + com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest.Builder builder = + com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest.builder() + .vaultId(config.getVaultId()) + .records(insertRecordDataList); + + if (request.getTable() != null && !request.getTable().isEmpty()) { + builder.tableName(request.getTable()); + } + + if (request.getUpsert() != null && !request.getUpsert().isEmpty()) { + if (request.getUpsertType() != null) { + FlowEnumUpdateType updateType = null; + if (request.getUpsertType() == UpsertType.REPLACE) { + updateType = FlowEnumUpdateType.REPLACE; + } else if (request.getUpsertType() == UpsertType.UPDATE) { + updateType = FlowEnumUpdateType.UPDATE; + } + V1Upsert upsert = V1Upsert.builder().uniqueColumns(request.getUpsert()).updateType(updateType).build(); + builder.upsert(upsert); + } else { + V1Upsert upsert = V1Upsert.builder().uniqueColumns(request.getUpsert()).build(); + builder.upsert(upsert); + } + } + return builder.build(); + } + + public static V1FlowDetokenizeRequest getBulkDetokenizeRequestBody(BulkDetokenizeRequest request, String vaultId) { + V1FlowDetokenizeRequest.Builder builder = V1FlowDetokenizeRequest.builder() + .vaultId(vaultId) + .tokens(request.getTokens()); + if (request.getTokenGroupRedactions() != null && !request.getTokenGroupRedactions().isEmpty()) { + List tokenGroupRedactionsList = new ArrayList<>(); + for (BulkTokenGroupRedactions tokenGroupRedactions : request.getTokenGroupRedactions()) { + tokenGroupRedactionsList.add(V1TokenGroupRedactions.builder() + .tokenGroupName(tokenGroupRedactions.getTokenGroupName()) + .redaction(tokenGroupRedactions.getRedaction()) + .build()); + } + builder.tokenGroupRedactions(tokenGroupRedactionsList); + } + return builder.build(); + } + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest getBulkDeleteTokensRequestBody(BulkDeleteTokensRequest request, String vaultId) { + return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder() + .vaultId(vaultId) + .tokens(request.getTokens()) + .build(); + } + + public static com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest getBulkTokenizeRequestBody(BulkTokenizeRequest request, String vaultId) { + List dataList = new ArrayList<>(); + for (BulkTokenizeRecord record : request.getData()) { + dataList.add(V1FlowTokenizeRequestObject.builder() + .value(record.getValue()) + .tokenGroupNames(record.getTokenGroupNames()) + .build()); + } + return com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest.builder() + .vaultId(vaultId) + .data(dataList) + .build(); + } + + // ── Bulk batching, exception-handling and response-formatting helpers ──── + + public static List> createBulkInsertBatches(List records, int batchSize) { + List> batches = new ArrayList<>(); + for (int i = 0; i < records.size(); i += batchSize) { + batches.add(records.subList(i, Math.min(i + batchSize, records.size()))); + } + return batches; + } + + public static List createBulkDetokenizeBatches(V1FlowDetokenizeRequest request, int batchSize) { + List detokenizeRequests = new ArrayList<>(); + List tokens = request.getTokens().get(); + + for (int i = 0; i < tokens.size(); i += batchSize) { + List batchTokens = tokens.subList(i, Math.min(i + batchSize, tokens.size())); + List tokenGroupRedactions = null; + if (request.getTokenGroupRedactions().isPresent() && !request.getTokenGroupRedactions().get().isEmpty()) { + tokenGroupRedactions = request.getTokenGroupRedactions().get(); + } + V1FlowDetokenizeRequest batchRequest = V1FlowDetokenizeRequest.builder() + .vaultId(request.getVaultId()) + .tokens(new ArrayList<>(batchTokens)) + .tokenGroupRedactions(tokenGroupRedactions) + .build(); + + detokenizeRequests.add(batchRequest); + } + + return detokenizeRequests; + } + + public static List createBulkDeleteTokensBatches( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest request, int batchSize) { + List batches = new ArrayList<>(); + List tokens = request.getTokens().get(); + for (int i = 0; i < tokens.size(); i += batchSize) { + List batchTokens = tokens.subList(i, Math.min(i + batchSize, tokens.size())); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batchRequest = + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest.builder() + .vaultId(request.getVaultId()) + .tokens(new ArrayList<>(batchTokens)) + .build(); + batches.add(batchRequest); + } + return batches; + } + + public static List createBulkTokenizeBatches( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest request, int batchSize) { + List batches = new ArrayList<>(); + List data = request.getData().get(); + for (int i = 0; i < data.size(); i += batchSize) { + List batchData = data.subList(i, Math.min(i + batchSize, data.size())); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batchRequest = + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest.builder() + .vaultId(request.getVaultId()) + .data(new ArrayList<>(batchData)) + .build(); + batches.add(batchRequest); + } + return batches; + } + + public static ErrorRecord createErrorRecord(Map recordMap, int indexNumber, String requestId) { + ErrorRecord err = null; + if (recordMap != null) { + int code = 500; + if (recordMap.containsKey("http_code")) { + code = (Integer) recordMap.get("http_code"); + } else if (recordMap.containsKey("httpCode")) { + code = (Integer) recordMap.get("httpCode"); + } else if (recordMap.containsKey("statusCode")) { + code = (Integer) recordMap.get("statusCode"); + } + String message = recordMap.containsKey("error") ? (String) recordMap.get("error") : + recordMap.containsKey("message") ? (String) recordMap.get("message") : "Unknown error"; + err = new ErrorRecord(indexNumber, message, code, requestId); + } + return err; + } + + public static List handleBulkInsertBatchException( + Throwable ex, List batch, int batchNumber, int batchSize + ) { + List errorRecords = new ArrayList<>(); + Throwable cause = ex.getCause(); + if (cause instanceof ApiClientApiException) { + ApiClientApiException apiException = (ApiClientApiException) cause; + String requestId = extractRequestId(apiException.headers()); + Object rawBody = apiException.body(); + Map responseBody = (rawBody instanceof Map) ? (Map) rawBody : null; + int indexNumber = batchNumber > 0 ? batchNumber * batchSize : 0; + if (responseBody != null) { + if (responseBody.containsKey("records")) { + Object recordss = responseBody.get("records"); + if (recordss instanceof List) { + List recordsList = (List) recordss; + for (Object record : recordsList) { + if (record instanceof Map) { + Map recordMap = (Map) record; + ErrorRecord err = createErrorRecord(recordMap, indexNumber, requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + } else if (responseBody.containsKey("error")) { + Object errField = responseBody.get("error"); + Map recordMap = (errField instanceof Map) ? (Map) errField : null; + String fallbackMsg = (errField instanceof String) ? (String) errField : null; + for (int j = 0; j < batch.size(); j++) { + ErrorRecord err = (recordMap != null) + ? createErrorRecord(recordMap, indexNumber, requestId) + : new ErrorRecord(indexNumber, fallbackMsg != null ? fallbackMsg : apiException.getMessage(), apiException.statusCode(), requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + if (errorRecords.isEmpty()) { + for (int j = 0; j < batch.size(); j++) { + errorRecords.add(new ErrorRecord(indexNumber, apiException.getMessage(), apiException.statusCode(), requestId)); + indexNumber++; + } + } + } else { + int indexNumber = batchNumber > 0 ? batchNumber * batchSize : 0; + for (int j = 0; j < batch.size(); j++) { + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); + errorRecords.add(err); + indexNumber++; + } + } + return errorRecords; + } + + public static List handleBulkDetokenizeBatchException( + Throwable ex, V1FlowDetokenizeRequest batch, int batchNumber, int batchSize + ) { + List errorRecords = new ArrayList<>(); + Throwable cause = ex.getCause(); + if (cause instanceof ApiClientApiException) { + ApiClientApiException apiException = (ApiClientApiException) cause; + String requestId = extractRequestId(apiException.headers()); + Object rawBody = apiException.body(); + Map responseBody = (rawBody instanceof Map) ? (Map) rawBody : null; + int indexNumber = batchNumber * batchSize; + if (responseBody != null) { + if (responseBody.containsKey("response")) { + Object recordss = responseBody.get("response"); + if (recordss instanceof List) { + List recordsList = (List) recordss; + for (Object record : recordsList) { + if (record instanceof Map) { + Map recordMap = (Map) record; + ErrorRecord err = createErrorRecord(recordMap, indexNumber, requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + } else if (responseBody.containsKey("error")) { + Object errField = responseBody.get("error"); + Map recordMap = (errField instanceof Map) ? (Map) errField : null; + String fallbackMsg = (errField instanceof String) ? (String) errField : null; + int tokenCount = batch.getTokens().isPresent() ? batch.getTokens().get().size() : 0; + for (int j = 0; j < tokenCount; j++) { + ErrorRecord err = (recordMap != null) + ? createErrorRecord(recordMap, indexNumber, requestId) + : new ErrorRecord(indexNumber, fallbackMsg != null ? fallbackMsg : apiException.getMessage(), apiException.statusCode(), requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + if (errorRecords.isEmpty()) { + int tokenCount = batch.getTokens().isPresent() ? batch.getTokens().get().size() : 0; + for (int j = 0; j < tokenCount; j++) { + errorRecords.add(new ErrorRecord(indexNumber, apiException.getMessage(), apiException.statusCode(), requestId)); + indexNumber++; + } + } + } else { + int indexNumber = batchNumber * batchSize; + for (int j = 0; j < batch.getTokens().get().size(); j++) { + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); + errorRecords.add(err); + indexNumber++; + } + } + return errorRecords; + } + + public static List handleBulkDeleteTokensBatchException( + Throwable ex, + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batch, + int batchNumber, int batchSize + ) { + List errorRecords = new ArrayList<>(); + Throwable cause = ex.getCause(); + if (cause instanceof ApiClientApiException) { + ApiClientApiException apiException = (ApiClientApiException) cause; + String requestId = extractRequestId(apiException.headers()); + Object rawBody = apiException.body(); + Map responseBody = (rawBody instanceof Map) ? (Map) rawBody : null; + int indexNumber = batchNumber * batchSize; + if (responseBody != null) { + if (responseBody.containsKey("tokens")) { + Object tokensList = responseBody.get("tokens"); + if (tokensList instanceof List) { + List recordsList = (List) tokensList; + for (Object record : recordsList) { + if (record instanceof Map) { + Map recordMap = (Map) record; + ErrorRecord err = createErrorRecord(recordMap, indexNumber, requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + } else if (responseBody.containsKey("error")) { + Object errField = responseBody.get("error"); + Map recordMap = (errField instanceof Map) ? (Map) errField : null; + String fallbackMsg = (errField instanceof String) ? (String) errField : null; + int tokenCount = batch.getTokens().isPresent() ? batch.getTokens().get().size() : 0; + for (int j = 0; j < tokenCount; j++) { + ErrorRecord err = (recordMap != null) + ? createErrorRecord(recordMap, indexNumber, requestId) + : new ErrorRecord(indexNumber, fallbackMsg != null ? fallbackMsg : apiException.getMessage(), apiException.statusCode(), requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + if (errorRecords.isEmpty()) { + int tokenCount = batch.getTokens().isPresent() ? batch.getTokens().get().size() : 0; + for (int j = 0; j < tokenCount; j++) { + errorRecords.add(new ErrorRecord(indexNumber, apiException.getMessage(), apiException.statusCode(), requestId)); + indexNumber++; + } + } + } else { + int indexNumber = batchNumber * batchSize; + for (int j = 0; j < batch.getTokens().get().size(); j++) { + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); + errorRecords.add(err); + indexNumber++; + } + } + return errorRecords; + } + + public static List handleBulkTokenizeBatchException( + Throwable ex, + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batch, + int batchNumber, int batchSize + ) { + List errorRecords = new ArrayList<>(); + Throwable cause = ex.getCause(); + if (cause instanceof ApiClientApiException) { + ApiClientApiException apiException = (ApiClientApiException) cause; + String requestId = extractRequestId(apiException.headers()); + Object rawBody = apiException.body(); + Map responseBody = (rawBody instanceof Map) ? (Map) rawBody : null; + int indexNumber = batchNumber * batchSize; + if (responseBody != null) { + if (responseBody.containsKey("response")) { + Object responseList = responseBody.get("response"); + if (responseList instanceof List) { + List recordsList = (List) responseList; + for (Object record : recordsList) { + if (record instanceof Map) { + Map recordMap = (Map) record; + ErrorRecord err = createErrorRecord(recordMap, indexNumber, requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + } else if (responseBody.containsKey("error")) { + Object errField = responseBody.get("error"); + Map recordMap = (errField instanceof Map) ? (Map) errField : null; + String fallbackMsg = (errField instanceof String) ? (String) errField : null; + int batchDataSize = batch.getData().isPresent() ? batch.getData().get().size() : 0; + for (int j = 0; j < batchDataSize; j++) { + ErrorRecord err = (recordMap != null) + ? createErrorRecord(recordMap, indexNumber, requestId) + : new ErrorRecord(indexNumber, fallbackMsg != null ? fallbackMsg : apiException.getMessage(), apiException.statusCode(), requestId); + errorRecords.add(err); + indexNumber++; + } + } + } + if (errorRecords.isEmpty()) { + int batchDataSize = batch.getData().isPresent() ? batch.getData().get().size() : 0; + for (int j = 0; j < batchDataSize; j++) { + errorRecords.add(new ErrorRecord(indexNumber, apiException.getMessage(), apiException.statusCode(), requestId)); + indexNumber++; + } + } + } else { + int indexNumber = batchNumber * batchSize; + int batchDataSize = batch.getData().isPresent() ? batch.getData().get().size() : 0; + for (int j = 0; j < batchDataSize; j++) { + ErrorRecord err = new ErrorRecord(indexNumber, ex.getMessage(), 500); + errorRecords.add(err); + indexNumber++; + } + } + return errorRecords; + } + + public static BulkInsertResponse formatBulkInsertResponse(V1InsertResponse response, int batch, int batchSize, Map> headers) { + BulkInsertResponse formattedResponse = null; + List successRecords = new ArrayList<>(); + List errorRecords = new ArrayList<>(); + if (response != null && response.getRecords().isPresent()) { + String requestId = extractRequestId(headers); + List record = response.getRecords().get(); + int indexNumber = batch * batchSize; + int recordsSize = record.size(); + for (int index = 0; index < recordsSize; index++) { + if (record.get(index).getError().isPresent()) { + ErrorRecord errorRecord = new ErrorRecord(indexNumber, record.get(index).getError().get(), record.get(index).getHttpCode().orElse(500), requestId); + errorRecords.add(errorRecord); + } else { + Map> tokensMap = null; + if (record.get(index).getTokens().isPresent()) { + tokensMap = new HashMap<>(); + Map tok = record.get(index).getTokens().get(); + for (Map.Entry entry : tok.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + List tokenList = new ArrayList<>(); + if (value instanceof List) { + List valueList = (List) value; + for (Object item : valueList) { + if (item instanceof Map) { + Map tokenMap = (Map) item; + com.skyflow.vault.data.Token token = new com.skyflow.vault.data.Token((String) tokenMap.get("token"), (String) tokenMap.get("tokenGroupName")); + tokenList.add(token); + } + } + } + tokensMap.put(key, tokenList); + } + } + Success success = new Success(indexNumber, record.get(index).getSkyflowId().orElse(null), tokensMap, record.get(index).getData().isPresent() ? record.get(index).getData().get() : null, record.get(index).getTableName().isPresent() ? record.get(index).getTableName().get() : null); + successRecords.add(success); + } + indexNumber++; + } + formattedResponse = new BulkInsertResponse(successRecords, errorRecords); + } + return formattedResponse; + } + + public static BulkDetokenizeResponse formatBulkDetokenizeResponse(V1FlowDetokenizeResponse response, int batch, int batchSize, Map> headers) { + if (response != null && response.getResponse().isPresent()) { + String requestId = extractRequestId(headers); + List record = response.getResponse().get(); + List errorRecords = new ArrayList<>(); + List successRecords = new ArrayList<>(); + int indexNumber = batch * batchSize; + int recordsSize = record.size(); + for (int index = 0; index < recordsSize; index++) { + if (record.get(index).getError().isPresent()) { + ErrorRecord errorRecord = new ErrorRecord(indexNumber, record.get(index).getError().get(), record.get(index).getHttpCode().orElse(500), requestId); + errorRecords.add(errorRecord); + } else { + DetokenizeResponseObject success = new DetokenizeResponseObject(indexNumber, record.get(index).getToken().orElse(null), record.get(index).getValue().orElse(null), record.get(index).getTokenGroupName().orElse(null), record.get(index).getError().orElse(null), record.get(index).getMetadata().orElse(null)); + successRecords.add(success); + } + indexNumber++; + } + return new BulkDetokenizeResponse(successRecords, errorRecords); + } + return null; + } + + public static BulkDeleteTokensResponse formatBulkDeleteTokensResponse( + V1FlowDeleteTokenResponse response, int batch, int batchSize, Map> headers) { + if (response != null && response.getTokens().isPresent()) { + String requestId = extractRequestId(headers); + List records = response.getTokens().get(); + List errorRecords = new ArrayList<>(); + List successRecords = new ArrayList<>(); + int indexNumber = batch * batchSize; + for (V1DeleteTokenResponseObject record : records) { + String tokenValue = record.getValue().orElse(null); + if (record.getError().isPresent() + && record.getError().get() != null + && !record.getError().get().isEmpty() + && record.getHttpCode().orElse(200) != 200) { + ErrorRecord errorRecord = new ErrorRecord(indexNumber, record.getError().get(), + record.getHttpCode().orElse(500), requestId); + errorRecords.add(errorRecord); + } else { + DeleteTokensSuccess success = new DeleteTokensSuccess(indexNumber, tokenValue); + successRecords.add(success); + } + indexNumber++; + } + return new BulkDeleteTokensResponse(successRecords, errorRecords); + } + return null; + } + + public static BulkTokenizeResponse formatBulkTokenizeResponse( + V1FlowTokenizeResponse response, + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batchRequest, + int batchNumber, int batchSize, Map> headers) { + if (response != null && response.getResponse().isPresent()) { + String requestId = extractRequestId(headers); + List records = response.getResponse().get(); + List successRecords = new ArrayList<>(); + List errorRecords = new ArrayList<>(); + int indexNumber = batchNumber * batchSize; + for (V1FlowTokenizeResponseObject record : records) { + Object value = record.getValue().orElse(null); + TokenizeSuccess successEntry = null; + if (record.getTokens().isPresent()) { + for (FlowTokenizeResponseObjectToken tokenObj : record.getTokens().get()) { + if (tokenObj.getError().isPresent()) { + errorRecords.add(new ErrorRecord(indexNumber, tokenObj.getError().get(), tokenObj.getHttpCode().orElse(500), requestId)); + } else if (tokenObj.getTokenGroupName().isPresent() && tokenObj.getToken().isPresent()) { + if (successEntry == null) { + successEntry = new TokenizeSuccess(indexNumber, value); + } + successEntry.addToken(tokenObj.getTokenGroupName().get(), tokenObj.getToken().get()); + } + } + } + if (successEntry != null) { + successRecords.add(successEntry); + } + indexNumber++; + } + return new BulkTokenizeResponse(successRecords, errorRecords); + } + return null; + } +} diff --git a/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java new file mode 100644 index 00000000..1d0228ed --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/utils/validations/Validations.java @@ -0,0 +1,623 @@ +package com.skyflow.utils.validations; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.InterfaceName; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.utils.Constants; +import com.skyflow.utils.Utils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.vault.data.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Validations extends BaseValidations { + private Validations() { + super(); + } + + public static void validateCredentials(Credentials credentials) throws SkyflowException { + int nonNullMembers = 0; + String path = credentials.getPath(); + String credentialsString = credentials.getCredentialsString(); + String token = credentials.getToken(); + String apiKey = credentials.getApiKey(); + Object context = credentials.getContext(); + ArrayList roles = credentials.getRoles(); + + if (path != null) nonNullMembers++; + if (credentialsString != null) nonNullMembers++; + if (token != null) nonNullMembers++; + if (apiKey != null) nonNullMembers++; + + if (nonNullMembers > 1) { + LogUtil.printErrorLog(ErrorLogs.MULTIPLE_TOKEN_GENERATION_MEANS_PASSED.getLog()); + throw new SkyflowException( + ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() + ); + } else if (nonNullMembers < 1) { + LogUtil.printErrorLog(ErrorLogs.NO_TOKEN_GENERATION_MEANS_PASSED.getLog()); + throw new SkyflowException( + ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NoTokenGenerationMeansPassed.getMessage() + ); + } else if (path != null && path.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_PATH.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialFilePath.getMessage()); + } else if (credentialsString != null && credentialsString.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_STRING.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialsString.getMessage()); + } else if (token != null && token.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_TOKEN_VALUE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyToken.getMessage()); + } else if (apiKey != null) { + if (apiKey.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_API_KEY_VALUE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyApikey.getMessage()); + } else { + Pattern pattern = Pattern.compile(Constants.API_KEY_REGEX); + Matcher matcher = pattern.matcher(apiKey); + if (!matcher.matches()) { + LogUtil.printErrorLog(ErrorLogs.INVALID_API_KEY.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidApikey.getMessage()); + } + } + } else if (roles != null) { + if (roles.isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_ROLES.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoles.getMessage()); + } else { + for (int index = 0; index < roles.size(); index++) { + String role = roles.get(index); + if (role == null || role.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_ROLE_IN_ROLES.getLog(), Integer.toString(index) + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoleInRoles.getMessage()); + } + } + } + } + if (context != null) { + if (context instanceof String) { + String ctxStr = (String) context; + if (ctxStr.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + } + } else if (context instanceof Map) { + Map ctxMap = (Map) context; + if (ctxMap.isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); + } + Pattern ctxKeyPattern = Pattern.compile(Constants.CONTEXT_KEY_REGEX); + for (Object key : ctxMap.keySet()) { + if (key == null || !ctxKeyPattern.matcher(key.toString()).matches()) { + String keyStr = key == null ? "null" : key.toString(); + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INVALID_CONTEXT_MAP_KEY.getLog(), keyStr)); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + Utils.parameterizedString(ErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); + } + } + } else { + LogUtil.printErrorLog(ErrorLogs.INVALID_CONTEXT_TYPE.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidContextType.getMessage()); + } + } + } + + + public static void validateVaultConfiguration(VaultConfig vaultConfig) throws SkyflowException { + String vaultId = vaultConfig.getVaultId(); + String clusterId = vaultConfig.getClusterId(); + String vaultURL = vaultConfig.getVaultURL(); + Credentials credentials = vaultConfig.getCredentials(); + + if (vaultId == null) { + LogUtil.printErrorLog(ErrorLogs.VAULT_ID_IS_REQUIRED.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidVaultId.getMessage()); + } else if (vaultId.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_VAULT_ID.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyVaultId.getMessage()); + } else if (credentials != null) { + validateCredentials(credentials); + } + + if (vaultURL != null) { + if (vaultURL.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_VAULT_URL.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyVaultUrl.getMessage()); + } else if (!Utils.isValidURL(vaultURL)) { + LogUtil.printErrorLog(ErrorLogs.INVALID_VAULT_URL_FORMAT.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidVaultUrlFormat.getMessage()); + } + } else if (Utils.getEnvVaultURL() == null) { + if (clusterId == null) { + LogUtil.printErrorLog(ErrorLogs.EITHER_VAULT_URL_OR_CLUSTER_ID_REQUIRED.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EitherVaultUrlOrClusterIdRequired.getMessage()); + } else if (clusterId.trim().isEmpty()) { + LogUtil.printErrorLog(ErrorLogs.EMPTY_CLUSTER_ID.getLog()); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyClusterId.getMessage()); + } + } + } + + + public static void validateInsertRequest(InsertRequest insertRequest) throws SkyflowException { + if (insertRequest == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INSERT_REQUEST_NULL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InsertRequestNull.getMessage()); + } + String table = insertRequest.getTable(); + ArrayList records = insertRequest.getRecords(); + if (records == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.RECORDS_IS_REQUIRED.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.RecordsKeyError.getMessage()); + } else if (records.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_RECORDS.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRecords.getMessage()); + } + + for (InsertRecord record : records) { + if(record == null){ + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INVALID_RECORD.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRecord.getMessage()); + } + } + + // table check if specified for both + if (insertRequest.getTable() != null && !table.trim().isEmpty()){ // if table name specified at both place + for (InsertRecord record : records) { + if (record.getTable() != null && !record.getTable().trim().isEmpty()){ + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TABLE_SPECIFIED_AT_BOTH_PLACE.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableSpecifiedInRequestAndRecordObject.getMessage()); + } + } + } + // table check if not specified for both or if missing in any object + if (insertRequest.getTable() == null || table.trim().isEmpty()){ // if table name specified at both place + for (InsertRecord record : records) { + if (record.getTable() == null || record.getTable().trim().isEmpty()){ + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TABLE_NOT_SPECIFIED_AT_BOTH_PLACE.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableNotSpecifiedInRequestAndRecordObject.getMessage()); + } + } + } + // upsert check 1 + if (insertRequest.getTable() != null && !table.trim().isEmpty()){ // if table name specified at both place + for (InsertRecord record : records) { + if (record.getUpsert() != null && record.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_UPSERT_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyUpsertValues.getMessage()); + } + if (record.getUpsert() != null && !record.getUpsert().isEmpty()){ + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.UPSERT_TABLE_REQUEST_AT_RECORD_LEVEL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.UpsertTableRequestAtRecordLevel.getMessage()); + } + } + } + // upsert check 2 + if (insertRequest.getTable() == null || table.trim().isEmpty()){ + if (insertRequest.getUpsert() != null && !insertRequest.getUpsert().isEmpty()){ + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.UPSERT_TABLE_REQUEST_AT_REQUEST_LEVEL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.UpsertTableRequestAtRequestLevel.getMessage()); + } + } + + if (insertRequest.getUpsert() != null && insertRequest.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_UPSERT_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyUpsertValues.getMessage()); + } + + for (InsertRecord record : records) { + if (record != null ) { + if (record.getData() != null){ + for (String key : record.getData().keySet()) { + if (key == null || key.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_KEY_IN_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInRecords.getMessage()); + } else { + Object value = record.getData().get(key); + if (value == null || value.toString().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_VALUE_IN_VALUES.getLog(), + InterfaceName.INSERT.getName(), key + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInValues.getMessage()); + } + } + } + } + } + } + } + + public static void validateDetokenizeRequest(DetokenizeRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.DETOKENIZE_REQUEST_NULL.getLog(), InterfaceName.DETOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DetokenizeRequestNull.getMessage()); + } + ArrayList tokens = request.getDetokenizeData(); + if (tokens == null || tokens.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage()); + } + + for (int index = 0; index < tokens.size(); index++) { + DetokenizeData token = tokens.get(index); + if (token == null || token.getToken() == null || token.getToken().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(), + InterfaceName.DETOKENIZE.getName(), + String.valueOf(index))); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDetokenizeData.getMessage()); + } + } + + List groupRedactions = request.getTokenGroupRedactions(); + if (groupRedactions != null && !groupRedactions.isEmpty()) { + for (TokenGroupRedactions group : groupRedactions) { + if (group == null) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.NULL_TOKEN_REDACTION_GROUP_OBJECT.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullTokenGroupRedactions.getMessage()); + } + String groupName = group.getTokenGroupName(); + String redaction = group.getRedaction(); + if (groupName == null || groupName.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.NULL_TOKEN_GROUP_NAME_IN_TOKEN_GROUP.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullTokenGroupNameInTokenGroup.getMessage()); + } + if (redaction == null || redaction.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.EMPTY_OR_NULL_REDACTION_IN_TOKEN_GROUP.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullRedactionInTokenGroup.getMessage()); + } + } + } + + } + + public static void validateDeleteTokensRequest(DeleteTokensRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.DELETE_TOKENS_REQUEST_NULL.getLog(), InterfaceName.DELETE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeleteTokensRequestNull.getMessage()); + } + List tokens = request.getTokens(); + if (tokens == null || tokens.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_DELETE_TOKENS_DATA.getLog(), InterfaceName.DELETE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDeleteTokensData.getMessage()); + } + + for (int index = 0; index < tokens.size(); index++) { + String token = tokens.get(index); + if (token == null || token.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DELETE_TOKENS_DATA.getLog(), + InterfaceName.DELETE.getName(), + String.valueOf(index))); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDeleteTokensData.getMessage()); + } + } + } + + public static void validateTokenizeRequest(TokenizeRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TOKENIZE_REQUEST_NULL.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRequestNull.getMessage()); + } + ArrayList data = request.getData(); + if (data == null || data.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKENIZE_DATA.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenizeData.getMessage()); + } + for (int index = 0; index < data.size(); index++) { + TokenizeRecord record = data.get(index); + if (record == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TOKENIZE_RECORD_NULL.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRecordNull.getMessage()); + } + Object value = record.getValue(); + boolean isInvalidValue = value == null || (value instanceof String && ((String) value).trim().isEmpty()); + if (isInvalidValue) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_VALUE_IN_TOKENIZE_RECORD.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInTokenizeRecord.getMessage()); + } + List tokenGroupNames = record.getTokenGroupNames(); + if (tokenGroupNames == null || tokenGroupNames.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKEN_GROUP_NAMES_IN_TOKENIZE_RECORD.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenGroupNamesInTokenizeRecord.getMessage()); + } + for (int groupIndex = 0; groupIndex < tokenGroupNames.size(); groupIndex++) { + String groupName = tokenGroupNames.get(groupIndex); + if (groupName == null || groupName.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKEN_GROUP_NAME_IN_TOKENIZE_RECORD.getLog(), + InterfaceName.TOKENIZE.getName(), + String.valueOf(groupIndex))); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenGroupNameInTokenizeRecord.getMessage()); + } + } + } + } + + // ── Bulk (batched/concurrent) request validations ──────────────────────── + + public static void validateBulkInsertRequest(BulkInsertRequest insertRequest) throws SkyflowException { + if (insertRequest == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INSERT_REQUEST_NULL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InsertRequestNull.getMessage()); + } + String table = insertRequest.getTable(); + ArrayList records = insertRequest.getRecords(); + if (records == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.RECORDS_IS_REQUIRED.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.RecordsKeyError.getMessage()); + } else if (records.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_RECORDS.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRecords.getMessage()); + } + + for (BulkInsertRecord record : records) { + if (record == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.INVALID_RECORD.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidRecord.getMessage()); + } + } + + // table check if specified for both + if (insertRequest.getTable() != null && !table.trim().isEmpty()) { + for (BulkInsertRecord record : records) { + if (record.getTable() != null && !record.getTable().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TABLE_SPECIFIED_AT_BOTH_PLACE.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableSpecifiedInRequestAndRecordObject.getMessage()); + } + } + } + // table check if not specified for both or if missing in any object + if (insertRequest.getTable() == null || table.trim().isEmpty()) { + for (BulkInsertRecord record : records) { + if (record.getTable() == null || record.getTable().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TABLE_NOT_SPECIFIED_AT_BOTH_PLACE.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TableNotSpecifiedInRequestAndRecordObject.getMessage()); + } + } + } + // upsert check 1 + if (insertRequest.getTable() != null && !table.trim().isEmpty()) { + for (BulkInsertRecord record : records) { + if (record.getUpsert() != null && record.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_UPSERT_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyUpsertValues.getMessage()); + } + if (record.getUpsert() != null && !record.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.UPSERT_TABLE_REQUEST_AT_RECORD_LEVEL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.UpsertTableRequestAtRecordLevel.getMessage()); + } + } + } + // upsert check 2 + if (insertRequest.getTable() == null || table.trim().isEmpty()) { + if (insertRequest.getUpsert() != null && !insertRequest.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.UPSERT_TABLE_REQUEST_AT_REQUEST_LEVEL.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.UpsertTableRequestAtRequestLevel.getMessage()); + } + } + + if (insertRequest.getUpsert() != null && insertRequest.getUpsert().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_UPSERT_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyUpsertValues.getMessage()); + } + + for (BulkInsertRecord record : records) { + if (record.getData() != null) { + for (String key : record.getData().keySet()) { + if (key == null || key.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_KEY_IN_VALUES.getLog(), InterfaceName.INSERT.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyKeyInRecords.getMessage()); + } else { + Object value = record.getData().get(key); + if (value == null || value.toString().trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_VALUE_IN_VALUES.getLog(), + InterfaceName.INSERT.getName(), key + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInValues.getMessage()); + } + } + } + } + } + } + + public static void validateBulkDetokenizeRequest(BulkDetokenizeRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.DETOKENIZE_REQUEST_NULL.getLog(), InterfaceName.DETOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DetokenizeRequestNull.getMessage()); + } + List tokens = request.getTokens(); + if (tokens == null || tokens.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_DETOKENIZE_DATA.getLog(), InterfaceName.DETOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDetokenizeData.getMessage()); + } + + for (int index = 0; index < tokens.size(); index++) { + String token = tokens.get(index); + if (token == null || token.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DETOKENIZE_DATA.getLog(), + InterfaceName.DETOKENIZE.getName(), + String.valueOf(index))); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDetokenizeData.getMessage()); + } + } + + List groupRedactions = request.getTokenGroupRedactions(); + if (groupRedactions != null && !groupRedactions.isEmpty()) { + for (BulkTokenGroupRedactions group : groupRedactions) { + if (group == null) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.NULL_TOKEN_REDACTION_GROUP_OBJECT.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullTokenGroupRedactions.getMessage()); + } + String groupName = group.getTokenGroupName(); + String redaction = group.getRedaction(); + if (groupName == null || groupName.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.NULL_TOKEN_GROUP_NAME_IN_TOKEN_GROUP.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullTokenGroupNameInTokenGroup.getMessage()); + } + if (redaction == null || redaction.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.EMPTY_OR_NULL_REDACTION_IN_TOKEN_GROUP.getLog(), InterfaceName.DETOKENIZE.getName())); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NullRedactionInTokenGroup.getMessage()); + } + } + } + } + + public static void validateBulkDeleteTokensRequest(BulkDeleteTokensRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.DELETE_TOKENS_REQUEST_NULL.getLog(), InterfaceName.DELETE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.DeleteTokensRequestNull.getMessage()); + } + List tokens = request.getTokens(); + if (tokens == null || tokens.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_DELETE_TOKENS_DATA.getLog(), InterfaceName.DELETE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyDeleteTokensData.getMessage()); + } + + for (int index = 0; index < tokens.size(); index++) { + String token = tokens.get(index); + if (token == null || token.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_OR_NULL_TOKEN_IN_DELETE_TOKENS_DATA.getLog(), + InterfaceName.DELETE.getName(), + String.valueOf(index))); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenInDeleteTokensData.getMessage()); + } + } + } + + public static void validateBulkTokenizeRequest(BulkTokenizeRequest request) throws SkyflowException { + if (request == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TOKENIZE_REQUEST_NULL.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRequestNull.getMessage()); + } + List data = request.getData(); + if (data == null || data.isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKENIZE_DATA.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenizeData.getMessage()); + } + for (int i = 0; i < data.size(); i++) { + BulkTokenizeRecord record = data.get(i); + if (record == null) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.TOKENIZE_RECORD_NULL.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.TokenizeRecordNull.getMessage()); + } + Object value = record.getValue(); + boolean isInvalid = value == null + || (value instanceof String && ((String) value).trim().isEmpty()); + if (isInvalid) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_VALUE_IN_TOKENIZE_RECORD.getLog(), InterfaceName.TOKENIZE.getName() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyValueInTokenizeRecord.getMessage()); + } + List tokenGroupNames = record.getTokenGroupNames(); + if (tokenGroupNames != null) { + for (int j = 0; j < tokenGroupNames.size(); j++) { + String groupName = tokenGroupNames.get(j); + if (groupName == null || groupName.trim().isEmpty()) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.EMPTY_TOKEN_GROUP_NAME_IN_TOKENIZE_RECORD.getLog(), + InterfaceName.TOKENIZE.getName(), + String.valueOf(j) + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyTokenGroupNameInTokenizeRecord.getMessage()); + } + } + } + } + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java new file mode 100644 index 00000000..476ce9d5 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -0,0 +1,1113 @@ +package com.skyflow.vault.controller; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonObject; +import com.skyflow.VaultClient; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest; +import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; +import com.skyflow.generated.rest.types.V1FlowTokenizeResponse; +import com.skyflow.generated.rest.types.V1InsertRecordData; +import com.skyflow.generated.rest.types.V1InsertResponse; +import com.skyflow.generated.rest.types.V1Upsert; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.logs.WarningLogs; +import com.skyflow.utils.Constants; +import com.skyflow.utils.Utils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.utils.validations.Validations; +import com.skyflow.vault.data.*; +import io.github.cdimascio.dotenv.Dotenv; +import io.github.cdimascio.dotenv.DotenvException; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static com.skyflow.utils.Utils.*; + +public final class VaultController extends VaultClient + implements IVaultController { + private static final Gson gson = new GsonBuilder().serializeNulls().create(); + private JsonObject metrics = Utils.getMetrics(); + + public VaultController(VaultConfig vaultConfig, Credentials credentials) throws SkyflowException { + super(vaultConfig, credentials); + } + + /** + * Immutable per-call batch size / concurrency limit. Computed fresh on every bulk call + * instead of being stored on instance fields, since a VaultController instance is cached + * and reused (see Skyflow#vaultClientsMap) and may be invoked concurrently from multiple + * threads. + */ + private static final class BatchConfig { + final int batchSize; + final int concurrencyLimit; + + BatchConfig(int batchSize, int concurrencyLimit) { + this.batchSize = batchSize; + this.concurrencyLimit = concurrencyLimit; + } + } + + private RequestOptions buildRequestOptions(RequestContext context) { + RequestOptions.Builder builder = RequestOptions.builder() + .addHeader(Constants.SDK_METRICS_HEADER_KEY, metrics.toString()); + context.getHeaders().forEach((k, v) -> builder.addHeader(k.toString(), v)); + return builder.build(); + } + + @Override + public InsertResponse insert(InsertRequest request) throws SkyflowException { + return insert(request, null); + } + + public InsertResponse insert(InsertRequest request, InsertOptions options) throws SkyflowException { + try { + LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_INSERT_REQUEST.getLog()); + Validations.validateInsertRequest(request); + setBearerToken(); + V1InsertRequest insertRequest = getBulkInsertRequestBody(request, super.getVaultConfig()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + RequestContext ctx = new RequestContext("INSERT"); + if (interceptor != null) interceptor.intercept(ctx); + V1InsertResponse response = this.getRecordsApi().withRawResponse().insert(insertRequest, buildRequestOptions(ctx)).body(); + return buildInsertResponse(response); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + @Override + public DetokenizeResponse detokenize(DetokenizeRequest request) throws SkyflowException { + return detokenize(request, null); + } + + public DetokenizeResponse detokenize(DetokenizeRequest request, DetokenizeOptions options) throws SkyflowException { + try { + LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog()); + Validations.validateDetokenizeRequest(request); + setBearerToken(); + + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest requestDetokenize = getDetokenizeRequestBody(request, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + RequestContext ctx = new RequestContext("DETOKENIZE"); + if (interceptor != null) interceptor.intercept(ctx); + com.skyflow.generated.rest.types.V1FlowDetokenizeResponse response = this.getRecordsApi().withRawResponse().detokenize(requestDetokenize, buildRequestOptions(ctx)).body(); + + return buildDetokenizeResponse(response); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + public TokenizeResponse tokenize(TokenizeRequest request) throws SkyflowException { + return tokenize(request, null); + } + + public TokenizeResponse tokenize(TokenizeRequest request, TokenizeOptions options) throws SkyflowException { + try { + LogUtil.printInfoLog(InfoLogs.TOKENIZE_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATING_TOKENIZE_REQUEST.getLog()); + Validations.validateTokenizeRequest(request); + setBearerToken(); + + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest requestTokenize = getTokenizeRequestBody(request, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + RequestContext ctx = new RequestContext("TOKENIZE"); + if (interceptor != null) interceptor.intercept(ctx); + ApiClientHttpResponse response = this.getRecordsApi().withRawResponse().tokenize(requestTokenize, buildRequestOptions(ctx)); + LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); + + TokenizeResponse tokenizeResponse = buildTokenizeResponse(response.body(), response.headers(), request.getData().size()); + LogUtil.printInfoLog(InfoLogs.TOKENIZE_SUCCESS.getLog()); + return tokenizeResponse; + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + public DeleteTokensResponse deleteTokens(DeleteTokensRequest request) throws SkyflowException { + return deleteTokens(request, null); + } + + public DeleteTokensResponse deleteTokens(DeleteTokensRequest request, DeleteTokensOptions options) throws SkyflowException { + try { + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_TRIGGERED.getLog()); + LogUtil.printInfoLog(InfoLogs.VALIDATE_DELETE_TOKENS_REQUEST.getLog()); + Validations.validateDeleteTokensRequest(request); + setBearerToken(); + + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest requestDeleteTokens = getDeleteTokensRequestBody(request, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + RequestContext ctx = new RequestContext("DELETE_TOKENS"); + if (interceptor != null) interceptor.intercept(ctx); + ApiClientHttpResponse response = this.getRecordsApi().withRawResponse().deletetoken(requestDeleteTokens, buildRequestOptions(ctx)); + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_REQUEST_RESOLVED.getLog()); + + DeleteTokensResponse deleteTokensResponse = buildDeleteTokensResponse(response.body(), response.headers(), request.getTokens().size()); + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_SUCCESS.getLog()); + return deleteTokensResponse; + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DELETE_TOKENS_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (ApiClientException e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_TOKENS_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + // ── Bulk Insert ─────────────────────────────────────────────────────────── + + public BulkInsertResponse bulkInsert(BulkInsertRequest insertRequest) throws SkyflowException { + return bulkInsert(insertRequest, null); + } + + public BulkInsertResponse bulkInsert(BulkInsertRequest insertRequest, InsertOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_INSERT_REQUEST.getLog()); + Validations.validateBulkInsertRequest(insertRequest); + BatchConfig cfg = configureInsertConcurrencyAndBatchSize(insertRequest.getRecords().size()); + + setBearerToken(); + V1InsertRequest request = Utils.getBulkInsertRequestBody(insertRequest, this.getVaultConfig()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + return this.processBulkInsertSync(request, insertRequest.getRecords(), interceptor, cfg); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } catch (ExecutionException e) { + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + Throwable cause = e.getCause(); + throw new SkyflowException(cause != null && cause.getMessage() != null ? cause.getMessage() : e.getMessage()); + } + } + + public CompletableFuture bulkInsertAsync(BulkInsertRequest insertRequest) throws SkyflowException { + return bulkInsertAsync(insertRequest, null); + } + + public CompletableFuture bulkInsertAsync(BulkInsertRequest insertRequest, InsertOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_INSERT_REQUEST.getLog()); + Validations.validateBulkInsertRequest(insertRequest); + BatchConfig cfg = configureInsertConcurrencyAndBatchSize(insertRequest.getRecords().size()); + + setBearerToken(); + V1InsertRequest request = Utils.getBulkInsertRequestBody(insertRequest, this.getVaultConfig()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + List errorRecords = Collections.synchronizedList(new ArrayList<>()); + List> futures = this.insertBatchFutures(request, errorRecords, interceptor, cfg); + + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> { + List successRecords = new ArrayList<>(); + + for (CompletableFuture future : futures) { + BulkInsertResponse futureResponse = future.join(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorRecords.addAll(futureResponse.getErrors()); + } + } + } + + return new BulkInsertResponse(successRecords, errorRecords, insertRequest.getRecords()); + }); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } + } + + // ── Bulk Detokenize ─────────────────────────────────────────────────────── + + public BulkDetokenizeResponse bulkDetokenize(BulkDetokenizeRequest detokenizeRequest) throws SkyflowException { + return bulkDetokenize(detokenizeRequest, null); + } + + public BulkDetokenizeResponse bulkDetokenize(BulkDetokenizeRequest detokenizeRequest, DetokenizeOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog()); + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog()); + Validations.validateBulkDetokenizeRequest(detokenizeRequest); + BatchConfig cfg = configureDetokenizeConcurrencyAndBatchSize(detokenizeRequest.getTokens().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest request = + Utils.getBulkDetokenizeRequestBody(detokenizeRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + return this.processBulkDetokenizeSync(request, detokenizeRequest.getTokens(), interceptor, cfg); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new SkyflowException(e.getMessage()); + } catch (ExecutionException e) { + throw new SkyflowException(e.getMessage()); + } + } + + public CompletableFuture bulkDetokenizeAsync(BulkDetokenizeRequest detokenizeRequest) throws SkyflowException { + return bulkDetokenizeAsync(detokenizeRequest, null); + } + + public CompletableFuture bulkDetokenizeAsync(BulkDetokenizeRequest detokenizeRequest, DetokenizeOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DETOKENIZE_TRIGGERED.getLog()); + ExecutorService executor = null; + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_DETOKENIZE_REQUEST.getLog()); + Validations.validateBulkDetokenizeRequest(detokenizeRequest); + BatchConfig cfg = configureDetokenizeConcurrencyAndBatchSize(detokenizeRequest.getTokens().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest request = + Utils.getBulkDetokenizeRequestBody(detokenizeRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + + List errorTokens = Collections.synchronizedList(new ArrayList<>()); + List successRecords = new ArrayList<>(); + + List batches = + Utils.createBulkDetokenizeBatches(request, cfg.batchSize); + + executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List> futures = this.detokenizeBatchFutures(executor, batches, errorTokens, interceptor, cfg.batchSize); + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> { + for (CompletableFuture future : futures) { + BulkDetokenizeResponse futureResponse = future.join(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorTokens.addAll(futureResponse.getErrors()); + } + } + } + LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog()); + return new BulkDetokenizeResponse(successRecords, errorTokens, detokenizeRequest.getTokens()); + }); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (SkyflowException e) { + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw e; + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + if (executor != null) executor.shutdown(); + } + } + + // ── Bulk Delete Tokens ──────────────────────────────────────────────────── + + public BulkDeleteTokensResponse bulkDeleteTokens(BulkDeleteTokensRequest deleteTokensRequest) throws SkyflowException { + return bulkDeleteTokens(deleteTokensRequest, null); + } + + public BulkDeleteTokensResponse bulkDeleteTokens(BulkDeleteTokensRequest deleteTokensRequest, DeleteTokensOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_TRIGGERED.getLog()); + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_DELETE_TOKENS_REQUEST.getLog()); + Validations.validateBulkDeleteTokensRequest(deleteTokensRequest); + BatchConfig cfg = configureDeleteTokensConcurrencyAndBatchSize(deleteTokensRequest.getTokens().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest request = + Utils.getBulkDeleteTokensRequestBody(deleteTokensRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + return this.processBulkDeleteTokensSync(request, deleteTokensRequest.getTokens(), interceptor, cfg); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (ExecutionException | InterruptedException e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + public CompletableFuture bulkDeleteTokensAsync(BulkDeleteTokensRequest deleteTokensRequest) throws SkyflowException { + return bulkDeleteTokensAsync(deleteTokensRequest, null); + } + + public CompletableFuture bulkDeleteTokensAsync(BulkDeleteTokensRequest deleteTokensRequest, DeleteTokensOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_TRIGGERED.getLog()); + ExecutorService executor = null; + try { + LogUtil.printInfoLog(InfoLogs.VALIDATE_DELETE_TOKENS_REQUEST.getLog()); + Validations.validateBulkDeleteTokensRequest(deleteTokensRequest); + BatchConfig cfg = configureDeleteTokensConcurrencyAndBatchSize(deleteTokensRequest.getTokens().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest request = + Utils.getBulkDeleteTokensRequestBody(deleteTokensRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + + List errorTokens = Collections.synchronizedList(new ArrayList<>()); + List successRecords = Collections.synchronizedList(new ArrayList<>()); + + List batches = + Utils.createBulkDeleteTokensBatches(request, cfg.batchSize); + + executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List> futures = + this.deleteTokensBatchFutures(executor, batches, interceptor, cfg.batchSize); + + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> { + for (CompletableFuture future : futures) { + BulkDeleteTokensResponse futureResponse = future.join(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorTokens.addAll(futureResponse.getErrors()); + } + } + } + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_REQUEST_RESOLVED.getLog()); + return new BulkDeleteTokensResponse(successRecords, errorTokens, deleteTokensRequest.getTokens()); + }); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (SkyflowException e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw e; + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + if (executor != null) executor.shutdown(); + } + } + + // ── Bulk Tokenize ───────────────────────────────────────────────────────── + + public BulkTokenizeResponse bulkTokenize(BulkTokenizeRequest tokenizeRequest) throws SkyflowException { + return bulkTokenize(tokenizeRequest, null); + } + + public BulkTokenizeResponse bulkTokenize(BulkTokenizeRequest tokenizeRequest, TokenizeOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.TOKENIZE_TRIGGERED.getLog()); + try { + LogUtil.printInfoLog(InfoLogs.VALIDATING_TOKENIZE_REQUEST.getLog()); + Validations.validateBulkTokenizeRequest(tokenizeRequest); + BatchConfig cfg = configureTokenizeConcurrencyAndBatchSize(tokenizeRequest.getData().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest request = + Utils.getBulkTokenizeRequestBody(tokenizeRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + return this.processBulkTokenizeSync(request, tokenizeRequest.getData(), interceptor, cfg); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (SkyflowException e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw e; + } catch (ExecutionException | InterruptedException e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + } + + public CompletableFuture bulkTokenizeAsync(BulkTokenizeRequest tokenizeRequest) throws SkyflowException { + return bulkTokenizeAsync(tokenizeRequest, null); + } + + public CompletableFuture bulkTokenizeAsync(BulkTokenizeRequest tokenizeRequest, TokenizeOptions options) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.TOKENIZE_TRIGGERED.getLog()); + ExecutorService executor = null; + try { + LogUtil.printInfoLog(InfoLogs.VALIDATING_TOKENIZE_REQUEST.getLog()); + Validations.validateBulkTokenizeRequest(tokenizeRequest); + BatchConfig cfg = configureTokenizeConcurrencyAndBatchSize(tokenizeRequest.getData().size()); + setBearerToken(); + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest request = + Utils.getBulkTokenizeRequestBody(tokenizeRequest, this.getVaultConfig().getVaultId()); + RequestInterceptor interceptor = options != null ? options.getInterceptor() : null; + + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + + List errorRecords = Collections.synchronizedList(new ArrayList<>()); + List successRecords = Collections.synchronizedList(new ArrayList<>()); + + List batches = + Utils.createBulkTokenizeBatches(request, cfg.batchSize); + + executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List> futures = + this.tokenizeBatchFutures(executor, batches, interceptor, cfg.batchSize); + + return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) + .thenApply(v -> { + for (CompletableFuture future : futures) { + BulkTokenizeResponse futureResponse = future.join(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorRecords.addAll(futureResponse.getErrors()); + } + } + } + LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); + return new BulkTokenizeResponse(successRecords, errorRecords, tokenizeRequest.getData()); + }); + } catch (ApiClientApiException e) { + String bodyString = gson.toJson(e.body()); + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + } catch (SkyflowException e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw e; + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + if (executor != null) executor.shutdown(); + } + } + + // ── Bulk private helpers ────────────────────────────────────────────────── + + private BulkDeleteTokensResponse processBulkDeleteTokensSync( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest deleteTokensRequest, + List originalTokens, + RequestInterceptor interceptor, + BatchConfig cfg + ) throws ExecutionException, InterruptedException, SkyflowException { + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + List errorRecords = Collections.synchronizedList(new ArrayList<>()); + List successRecords = new ArrayList<>(); + ExecutorService executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List batches = + Utils.createBulkDeleteTokensBatches(deleteTokensRequest, cfg.batchSize); + try { + List> futures = + this.deleteTokensBatchFutures(executor, batches, interceptor, cfg.batchSize); + try { + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).get(); + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + } + for (CompletableFuture future : futures) { + BulkDeleteTokensResponse futureResponse = future.get(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) successRecords.addAll(futureResponse.getSuccess()); + if (futureResponse.getErrors() != null) errorRecords.addAll(futureResponse.getErrors()); + } + } + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + executor.shutdown(); + } + BulkDeleteTokensResponse response = new BulkDeleteTokensResponse(successRecords, errorRecords, originalTokens); + LogUtil.printInfoLog(InfoLogs.DELETE_TOKENS_REQUEST_RESOLVED.getLog()); + return response; + } + + private List> deleteTokensBatchFutures( + ExecutorService executor, + List batches, + RequestInterceptor interceptor, + int batchSize) { + List> futures = new ArrayList<>(); + if (batches == null) return futures; + for (int batchIndex = 0; batchIndex < batches.size(); batchIndex++) { + final int index = batchIndex; + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batch = batches.get(index); + RequestContext ctx = new RequestContext("DELETE_TOKENS"); + if (interceptor != null) interceptor.intercept(ctx); + CompletableFuture future = CompletableFuture + .supplyAsync(() -> processDeleteTokensBatch(batch, ctx), executor) + .handle((result, ex) -> { + if (ex != null) { + List batchErrors = + Utils.handleBulkDeleteTokensBatchException(ex, batch, index, batchSize); + return new BulkDeleteTokensResponse(new ArrayList<>(), batchErrors); + } + return Utils.formatBulkDeleteTokensResponse(result.body(), index, batchSize, result.headers()); + }); + futures.add(future); + } + return futures; + } + + private ApiClientHttpResponse processDeleteTokensBatch( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest batch, + RequestContext ctx) { + return this.getRecordsApi().withRawResponse().deletetoken(batch, buildRequestOptions(ctx)); + } + + private BatchConfig configureDeleteTokensConcurrencyAndBatchSize(int totalRequests) { + int batchSize = Constants.DELETE_TOKENS_BATCH_SIZE; + int concurrencyLimit; + try { + String userProvidedBatchSize = System.getenv("DELETE_TOKENS_BATCH_SIZE"); + String userProvidedConcurrencyLimit = System.getenv("DELETE_TOKENS_CONCURRENCY_LIMIT"); + + Dotenv dotenv = null; + try { + dotenv = Dotenv.load(); + } catch (DotenvException ignored) {} + + if (userProvidedBatchSize == null && dotenv != null) { + userProvidedBatchSize = dotenv.get("DELETE_TOKENS_BATCH_SIZE"); + } + if (userProvidedConcurrencyLimit == null && dotenv != null) { + userProvidedConcurrencyLimit = dotenv.get("DELETE_TOKENS_CONCURRENCY_LIMIT"); + } + + if (userProvidedBatchSize != null) { + try { + int parsedBatchSize = Integer.parseInt(userProvidedBatchSize); + if (parsedBatchSize > Constants.MAX_DELETE_TOKENS_BATCH_SIZE) { + LogUtil.printWarningLog(WarningLogs.BATCH_SIZE_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxBatchSize = Math.min(parsedBatchSize, Constants.MAX_DELETE_TOKENS_BATCH_SIZE); + if (maxBatchSize > 0) { + batchSize = maxBatchSize; + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.DELETE_TOKENS_BATCH_SIZE; + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.DELETE_TOKENS_BATCH_SIZE; + } + } + + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + + if (userProvidedConcurrencyLimit != null) { + try { + int parsedConcurrencyLimit = Integer.parseInt(userProvidedConcurrencyLimit); + if (parsedConcurrencyLimit > Constants.MAX_DELETE_TOKENS_CONCURRENCY_LIMIT) { + LogUtil.printWarningLog(WarningLogs.CONCURRENCY_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxConcurrencyLimit = Math.min(parsedConcurrencyLimit, Constants.MAX_DELETE_TOKENS_CONCURRENCY_LIMIT); + if (maxConcurrencyLimit > 0) { + concurrencyLimit = Math.min(maxConcurrencyLimit, maxConcurrencyNeeded); + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.DELETE_TOKENS_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.DELETE_TOKENS_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } else { + concurrencyLimit = Math.min(Constants.DELETE_TOKENS_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (Exception e) { + batchSize = Constants.DELETE_TOKENS_BATCH_SIZE; + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + concurrencyLimit = Math.min(Constants.DELETE_TOKENS_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + return new BatchConfig(batchSize, concurrencyLimit); + } + + private BulkTokenizeResponse processBulkTokenizeSync( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest tokenizeRequest, + ArrayList originalData, + RequestInterceptor interceptor, + BatchConfig cfg + ) throws ExecutionException, InterruptedException, SkyflowException { + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + List errorRecords = Collections.synchronizedList(new ArrayList<>()); + List successRecords = new ArrayList<>(); + ExecutorService executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List batches = + Utils.createBulkTokenizeBatches(tokenizeRequest, cfg.batchSize); + try { + List> futures = + this.tokenizeBatchFutures(executor, batches, interceptor, cfg.batchSize); + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allFutures.join(); + } catch (Exception e) { + // individual batch errors are already captured + } + for (CompletableFuture future : futures) { + BulkTokenizeResponse futureResponse = future.get(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorRecords.addAll(futureResponse.getErrors()); + } + } + } + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + executor.shutdown(); + } + BulkTokenizeResponse response = new BulkTokenizeResponse(successRecords, errorRecords, originalData); + LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); + return response; + } + + private List> tokenizeBatchFutures( + ExecutorService executor, + List batches, + RequestInterceptor interceptor, + int batchSize) { + List> futures = new ArrayList<>(); + if (batches == null) return futures; + for (int batchIndex = 0; batchIndex < batches.size(); batchIndex++) { + final int index = batchIndex; + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batch = batches.get(index); + RequestContext ctx = new RequestContext("TOKENIZE"); + if (interceptor != null) interceptor.intercept(ctx); + CompletableFuture future = CompletableFuture + .supplyAsync(() -> processTokenizeBatch(batch, ctx), executor) + .handle((result, ex) -> { + if (ex != null) { + List batchErrors = + Utils.handleBulkTokenizeBatchException(ex, batch, index, batchSize); + return new BulkTokenizeResponse(new ArrayList<>(), batchErrors); + } + return Utils.formatBulkTokenizeResponse(result.body(), batch, index, batchSize, result.headers()); + }); + futures.add(future); + } + return futures; + } + + private ApiClientHttpResponse processTokenizeBatch( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest batch, + RequestContext ctx) { + return this.getRecordsApi().withRawResponse().tokenize(batch, buildRequestOptions(ctx)); + } + + private BatchConfig configureTokenizeConcurrencyAndBatchSize(int totalRequests) { + int batchSize = Constants.TOKENIZE_BATCH_SIZE; + int concurrencyLimit; + try { + String userProvidedBatchSize = System.getenv("TOKENIZE_BATCH_SIZE"); + String userProvidedConcurrencyLimit = System.getenv("TOKENIZE_CONCURRENCY_LIMIT"); + + Dotenv dotenv = null; + try { + dotenv = Dotenv.load(); + } catch (DotenvException ignored) {} + + if (userProvidedBatchSize == null && dotenv != null) { + userProvidedBatchSize = dotenv.get("TOKENIZE_BATCH_SIZE"); + } + if (userProvidedConcurrencyLimit == null && dotenv != null) { + userProvidedConcurrencyLimit = dotenv.get("TOKENIZE_CONCURRENCY_LIMIT"); + } + + if (userProvidedBatchSize != null) { + try { + int parsedBatchSize = Integer.parseInt(userProvidedBatchSize); + if (parsedBatchSize > Constants.MAX_TOKENIZE_BATCH_SIZE) { + LogUtil.printWarningLog(WarningLogs.BATCH_SIZE_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxBatchSize = Math.min(parsedBatchSize, Constants.MAX_TOKENIZE_BATCH_SIZE); + if (maxBatchSize > 0) { + batchSize = maxBatchSize; + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.TOKENIZE_BATCH_SIZE; + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.TOKENIZE_BATCH_SIZE; + } + } + + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + + if (userProvidedConcurrencyLimit != null) { + try { + int parsedConcurrencyLimit = Integer.parseInt(userProvidedConcurrencyLimit); + if (parsedConcurrencyLimit > Constants.MAX_TOKENIZE_CONCURRENCY_LIMIT) { + LogUtil.printWarningLog(WarningLogs.CONCURRENCY_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxConcurrencyLimit = Math.min(parsedConcurrencyLimit, Constants.MAX_TOKENIZE_CONCURRENCY_LIMIT); + if (maxConcurrencyLimit > 0) { + concurrencyLimit = Math.min(maxConcurrencyLimit, maxConcurrencyNeeded); + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.TOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.TOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } else { + concurrencyLimit = Math.min(Constants.TOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (Exception e) { + batchSize = Constants.TOKENIZE_BATCH_SIZE; + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + concurrencyLimit = Math.min(Constants.TOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + return new BatchConfig(batchSize, concurrencyLimit); + } + + private BatchConfig configureDetokenizeConcurrencyAndBatchSize(int totalRequests) { + int batchSize = Constants.DETOKENIZE_BATCH_SIZE; + int concurrencyLimit; + try { + String userProvidedBatchSize = System.getenv("DETOKENIZE_BATCH_SIZE"); + String userProvidedConcurrencyLimit = System.getenv("DETOKENIZE_CONCURRENCY_LIMIT"); + + Dotenv dotenv = null; + try { + dotenv = Dotenv.load(); + } catch (DotenvException ignored) { + // ignore the case if .env file is not found + } + + if (userProvidedBatchSize == null && dotenv != null) { + userProvidedBatchSize = dotenv.get("DETOKENIZE_BATCH_SIZE"); + } + if (userProvidedConcurrencyLimit == null && dotenv != null) { + userProvidedConcurrencyLimit = dotenv.get("DETOKENIZE_CONCURRENCY_LIMIT"); + } + + if (userProvidedBatchSize != null) { + try { + int parsedBatchSize = Integer.parseInt(userProvidedBatchSize); + if (parsedBatchSize > Constants.MAX_DETOKENIZE_BATCH_SIZE) { + LogUtil.printWarningLog(WarningLogs.BATCH_SIZE_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxBatchSize = Math.min(parsedBatchSize, Constants.MAX_DETOKENIZE_BATCH_SIZE); + if (maxBatchSize > 0) { + batchSize = maxBatchSize; + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.DETOKENIZE_BATCH_SIZE; + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.DETOKENIZE_BATCH_SIZE; + } + } + + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + + if (userProvidedConcurrencyLimit != null) { + try { + int parsedConcurrencyLimit = Integer.parseInt(userProvidedConcurrencyLimit); + if (parsedConcurrencyLimit > Constants.MAX_DETOKENIZE_CONCURRENCY_LIMIT) { + LogUtil.printWarningLog(WarningLogs.CONCURRENCY_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxConcurrencyLimit = Math.min(parsedConcurrencyLimit, Constants.MAX_DETOKENIZE_CONCURRENCY_LIMIT); + + if (maxConcurrencyLimit > 0) { + concurrencyLimit = Math.min(maxConcurrencyLimit, maxConcurrencyNeeded); + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.DETOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.DETOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } else { + concurrencyLimit = Math.min(Constants.DETOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (Exception e) { + batchSize = Constants.DETOKENIZE_BATCH_SIZE; + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + concurrencyLimit = Math.min(Constants.DETOKENIZE_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + return new BatchConfig(batchSize, concurrencyLimit); + } + + private BulkInsertResponse processBulkInsertSync( + V1InsertRequest insertRequest, + ArrayList originalPayload, + RequestInterceptor interceptor, + BatchConfig cfg + ) throws ExecutionException, InterruptedException, SkyflowException { + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + List successRecords = new ArrayList<>(); + List errorRecords = Collections.synchronizedList(new ArrayList<>()); + List> futures = this.insertBatchFutures(insertRequest, errorRecords, interceptor, cfg); + + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + try { + allFutures.join(); + } catch (Exception e) { + // individual batch errors are already captured + } + for (CompletableFuture future : futures) { + BulkInsertResponse futureResponse = future.get(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successRecords.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorRecords.addAll(futureResponse.getErrors()); + } + } + } + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } + BulkInsertResponse response = new BulkInsertResponse(successRecords, errorRecords, originalPayload); + LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); + return response; + } + + private BulkDetokenizeResponse processBulkDetokenizeSync( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest detokenizeRequest, + List originalTokens, + RequestInterceptor interceptor, + BatchConfig cfg + ) throws ExecutionException, InterruptedException, SkyflowException { + LogUtil.printInfoLog(InfoLogs.PROCESSING_BATCHES.getLog()); + List errorTokens = Collections.synchronizedList(new ArrayList<>()); + List successTokens = new ArrayList<>(); + ExecutorService executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List batches = + Utils.createBulkDetokenizeBatches(detokenizeRequest, cfg.batchSize); + try { + List> futures = this.detokenizeBatchFutures(executor, batches, errorTokens, interceptor, cfg.batchSize); + try { + CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allFutures.join(); + } catch (Exception e) { + // individual batch errors are already captured + } + for (CompletableFuture future : futures) { + BulkDetokenizeResponse futureResponse = future.get(); + if (futureResponse != null) { + if (futureResponse.getSuccess() != null) { + successTokens.addAll(futureResponse.getSuccess()); + } + if (futureResponse.getErrors() != null) { + errorTokens.addAll(futureResponse.getErrors()); + } + } + } + } catch (Exception e) { + LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); + throw new SkyflowException(e.getMessage()); + } finally { + executor.shutdown(); + } + BulkDetokenizeResponse response = new BulkDetokenizeResponse(successTokens, errorTokens, originalTokens); + LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog()); + return response; + } + + private List> detokenizeBatchFutures( + ExecutorService executor, + List batches, + List errorTokens, + RequestInterceptor interceptor, + int batchSize) { + List> futures = new ArrayList<>(); + try { + for (int batchIndex = 0; batchIndex < batches.size(); batchIndex++) { + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest batch = batches.get(batchIndex); + int batchNumber = batchIndex; + RequestContext ctx = new RequestContext("DETOKENIZE"); + if (interceptor != null) interceptor.intercept(ctx); + CompletableFuture future = CompletableFuture + .supplyAsync(() -> processDetokenizeBatch(batch, ctx), executor) + .thenApply(response -> Utils.formatBulkDetokenizeResponse(response.body(), batchNumber, batchSize, response.headers())) + .exceptionally(ex -> { + errorTokens.addAll(Utils.handleBulkDetokenizeBatchException(ex, batch, batchNumber, batchSize)); + return null; + }); + futures.add(future); + } + } catch (Exception e) { + ErrorRecord errorRecord = new ErrorRecord(0, e.getMessage(), 500); + errorTokens.add(errorRecord); + } + return futures; + } + + private ApiClientHttpResponse processDetokenizeBatch( + com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest batch, + RequestContext ctx) { + return this.getRecordsApi().withRawResponse().detokenize(batch, buildRequestOptions(ctx)); + } + + private List> insertBatchFutures( + V1InsertRequest insertRequest, + List errorRecords, + RequestInterceptor interceptor, + BatchConfig cfg) { + List records = insertRequest.getRecords().get(); + + ExecutorService executor = Executors.newFixedThreadPool(cfg.concurrencyLimit); + List> batches = Utils.createBulkInsertBatches(records, cfg.batchSize); + List> futures = new ArrayList<>(); + V1Upsert upsert = insertRequest.getUpsert().isPresent() ? insertRequest.getUpsert().get() : null; + + try { + for (int batchIndex = 0; batchIndex < batches.size(); batchIndex++) { + List batch = batches.get(batchIndex); + int batchNumber = batchIndex; + RequestContext ctx = new RequestContext("INSERT"); + if (interceptor != null) interceptor.intercept(ctx); + CompletableFuture future = CompletableFuture + .supplyAsync(() -> insertBatch(batch, insertRequest.getTableName().isPresent() ? insertRequest.getTableName().get() : null, upsert, ctx), executor) + .thenApply(response -> Utils.formatBulkInsertResponse(response.body(), batchNumber, cfg.batchSize, response.headers())) + .exceptionally(ex -> { + errorRecords.addAll(Utils.handleBulkInsertBatchException(ex, batch, batchNumber, cfg.batchSize)); + return null; + }); + futures.add(future); + } + } finally { + executor.shutdown(); + } + return futures; + } + + private ApiClientHttpResponse insertBatch(List batch, String tableName, V1Upsert upsert, RequestContext ctx) { + V1InsertRequest.Builder req = V1InsertRequest.builder() + .vaultId(this.getVaultConfig().getVaultId()) + .records(batch) + .upsert(upsert); + if (tableName != null && !tableName.isEmpty()) { + req.tableName(tableName); + } + V1InsertRequest request = req.build(); + return this.getRecordsApi().withRawResponse().insert(request, buildRequestOptions(ctx)); + } + + private BatchConfig configureInsertConcurrencyAndBatchSize(int totalRequests) { + int batchSize = Constants.INSERT_BATCH_SIZE; + int concurrencyLimit; + try { + String userProvidedBatchSize = System.getenv("INSERT_BATCH_SIZE"); + String userProvidedConcurrencyLimit = System.getenv("INSERT_CONCURRENCY_LIMIT"); + + Dotenv dotenv = null; + try { + dotenv = Dotenv.load(); + } catch (DotenvException ignored) { + // ignore the case if .env file is not found + } + + if (userProvidedBatchSize == null && dotenv != null) { + userProvidedBatchSize = dotenv.get("INSERT_BATCH_SIZE"); + } + if (userProvidedConcurrencyLimit == null && dotenv != null) { + userProvidedConcurrencyLimit = dotenv.get("INSERT_CONCURRENCY_LIMIT"); + } + + if (userProvidedBatchSize != null) { + try { + int parsedBatchSize = Integer.parseInt(userProvidedBatchSize); + if (parsedBatchSize > Constants.MAX_INSERT_BATCH_SIZE) { + LogUtil.printWarningLog(WarningLogs.BATCH_SIZE_EXCEEDS_MAX_LIMIT.getLog()); + } + int maxBatchSize = Math.min(parsedBatchSize, Constants.MAX_INSERT_BATCH_SIZE); + if (maxBatchSize > 0) { + batchSize = maxBatchSize; + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.INSERT_BATCH_SIZE; + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_BATCH_SIZE_PROVIDED.getLog()); + batchSize = Constants.INSERT_BATCH_SIZE; + } + } + + // Max no of threads required to run all batches concurrently at once + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + + if (userProvidedConcurrencyLimit != null) { + try { + int parsedConcurrencyLimit = Integer.parseInt(userProvidedConcurrencyLimit); + int maxConcurrencyLimit = Math.min(parsedConcurrencyLimit, Constants.MAX_INSERT_CONCURRENCY_LIMIT); + if (parsedConcurrencyLimit > Constants.MAX_INSERT_CONCURRENCY_LIMIT) { + LogUtil.printWarningLog(WarningLogs.CONCURRENCY_EXCEEDS_MAX_LIMIT.getLog()); + } + if (maxConcurrencyLimit > 0) { + concurrencyLimit = Math.min(maxConcurrencyLimit, maxConcurrencyNeeded); + } else { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.INSERT_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (NumberFormatException e) { + LogUtil.printWarningLog(WarningLogs.INVALID_CONCURRENCY_LIMIT_PROVIDED.getLog()); + concurrencyLimit = Math.min(Constants.INSERT_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } else { + concurrencyLimit = Math.min(Constants.INSERT_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + } catch (Exception e) { + batchSize = Constants.INSERT_BATCH_SIZE; + int maxConcurrencyNeeded = (totalRequests + batchSize - 1) / batchSize; + concurrencyLimit = Math.min(Constants.INSERT_CONCURRENCY_LIMIT, maxConcurrencyNeeded); + } + return new BatchConfig(batchSize, concurrencyLimit); + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensRequest.java new file mode 100644 index 00000000..8b8e56ea --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensRequest.java @@ -0,0 +1,34 @@ +package com.skyflow.vault.data; + +import java.util.List; + +public class BulkDeleteTokensRequest { + private final BulkDeleteTokensRequestBuilder builder; + + private BulkDeleteTokensRequest(BulkDeleteTokensRequestBuilder builder) { + this.builder = builder; + } + + public static BulkDeleteTokensRequestBuilder builder() { + return new BulkDeleteTokensRequestBuilder(); + } + + public List getTokens() { + return this.builder.tokens; + } + + public static final class BulkDeleteTokensRequestBuilder { + private List tokens; + + private BulkDeleteTokensRequestBuilder() {} + + public BulkDeleteTokensRequestBuilder tokens(List tokens) { + this.tokens = tokens; + return this; + } + + public BulkDeleteTokensRequest build() { + return new BulkDeleteTokensRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensResponse.java new file mode 100644 index 00000000..47733c5d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkDeleteTokensResponse.java @@ -0,0 +1,50 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +import java.util.List; + +public class BulkDeleteTokensResponse { + @Expose(serialize = true) + private DeleteTokensSummary summary; + + @Expose(serialize = true) + private List success; + + @Expose(serialize = true) + private List errors; + + private List originalPayload; + + public BulkDeleteTokensResponse(List success, List errors) { + this.success = success; + this.errors = errors; + } + + public BulkDeleteTokensResponse(List success, List errors, List originalPayload) { + this.success = success; + this.errors = errors; + this.originalPayload = originalPayload; + this.summary = new DeleteTokensSummary(this.originalPayload.size(), this.success.size(), this.errors.size()); + } + + public DeleteTokensSummary getSummary() { + return summary; + } + + public List getSuccess() { + return success; + } + + public List getErrors() { + return errors; + } + + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeRequest.java new file mode 100644 index 00000000..a7a842b5 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeRequest.java @@ -0,0 +1,41 @@ +package com.skyflow.vault.data; + +import java.util.List; + +public class BulkDetokenizeRequest { + private final BulkDetokenizeRequestBuilder builder; + private BulkDetokenizeRequest(BulkDetokenizeRequestBuilder builder){ + this.builder = builder; + } + + public static BulkDetokenizeRequestBuilder builder(){ + return new BulkDetokenizeRequestBuilder(); + } + public List getTokens(){ + return this.builder.tokens; + } + public List getTokenGroupRedactions(){ + return this.builder.tokenGroupRedactions; + } + + public static final class BulkDetokenizeRequestBuilder{ + private List tokens; + + private List tokenGroupRedactions; + + public BulkDetokenizeRequestBuilder tokens(List tokens){ + this.tokens = tokens; + return this; + } + public BulkDetokenizeRequestBuilder tokenGroupRedactions(List tokenGroupRedactions){ + this.tokenGroupRedactions = tokenGroupRedactions; + return this; + } + public BulkDetokenizeRequest build(){ + return new BulkDetokenizeRequest(this); + } + + + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeResponse.java new file mode 100644 index 00000000..a1ad1ee7 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkDetokenizeResponse.java @@ -0,0 +1,63 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class BulkDetokenizeResponse { + @Expose(serialize = true) + private DetokenizeSummary summary; + + @Expose(serialize = true) + private List success; + + @Expose(serialize = true) + private List errors; + + private List originalPayload; + private List tokensToRetry; + + public BulkDetokenizeResponse(List success, List errors) { + this.success = success; + this.errors = errors; + } + + public BulkDetokenizeResponse(List success, List errors, List originalPayload) { + this.success = success; + this.errors = errors; + this.originalPayload = originalPayload; + this.summary = new DetokenizeSummary(this.originalPayload.size(), this.success.size(), this.errors.size()); + } + + public List getTokensToRetry() { + if (tokensToRetry == null) { + tokensToRetry = new ArrayList<>(); + tokensToRetry = errors.stream() + .filter(error -> (error.getCode() >= 500 && error.getCode() <= 599) && error.getCode() != 529) + .map(errorRecord -> originalPayload.get(errorRecord.getIndex())) + .collect(Collectors.toList()); + } + return tokensToRetry; + } + + public List getSuccess() { + return success; + } + public DetokenizeSummary getSummary() { + return this.summary; + } + + public List getErrors() { + return this.errors; + } + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRecord.java new file mode 100644 index 00000000..3aeae875 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRecord.java @@ -0,0 +1,68 @@ +package com.skyflow.vault.data; + +import com.skyflow.enums.UpsertType; + +import java.util.List; +import java.util.Map; + +public class BulkInsertRecord { + private final BulkInsertRecordBuilder builder; + + private BulkInsertRecord(BulkInsertRecordBuilder builder) { + this.builder = builder; + } + + // Getters + public String getTable() { + return this.builder.table; + } + + public Map getData() { + return this.builder.data; + } + + public List getUpsert() { + return this.builder.upsert; + } + + public UpsertType getUpsertType() { + return this.builder.upsertType; + } + + // Builder Class + public static final class BulkInsertRecordBuilder { + private String table; + private Map data; + private List upsert; + private UpsertType upsertType; + + public BulkInsertRecordBuilder table(String table) { + this.table = table; + return this; + } + + public BulkInsertRecordBuilder data(Map data) { + this.data = data; + return this; + } + + public BulkInsertRecordBuilder upsert(List upsert) { + this.upsert = upsert; + return this; + } + + public BulkInsertRecordBuilder upsertType(UpsertType upsertType) { + this.upsertType = upsertType; + return this; + } + + public BulkInsertRecord build() { + return new BulkInsertRecord(this); + } + } + + // Static entry point for builder + public static BulkInsertRecordBuilder builder() { + return new BulkInsertRecordBuilder(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequest.java new file mode 100644 index 00000000..7eda6f93 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertRequest.java @@ -0,0 +1,69 @@ +package com.skyflow.vault.data; + +import com.skyflow.enums.UpsertType; + +import java.util.ArrayList; +import java.util.List; + +public class BulkInsertRequest extends BaseInsertRequest { + private final BulkInsertRequestBuilder builder; + + private BulkInsertRequest(BulkInsertRequestBuilder builder) { + super(builder); + this.builder = builder; + } + + + public static BulkInsertRequestBuilder builder() { + return new BulkInsertRequestBuilder(); + } + + public List getUpsert() { + return this.builder.upsert; + } + + public UpsertType getUpsertType() { + return this.builder.upsertType; + } + + public ArrayList getRecords(){ + return this.builder.records; + } + + public static final class BulkInsertRequestBuilder extends BaseInsertRequestBuilder { + private List upsert; + + private UpsertType upsertType; + + private ArrayList records; + + private BulkInsertRequestBuilder() { + super(); + } + + @Override + public BulkInsertRequestBuilder table(String table) { + super.table(table); + return this; + } + + public BulkInsertRequestBuilder upsert(List upsert) { + this.upsert = upsert; + return this; + } + + public BulkInsertRequestBuilder upsertType(UpsertType upsertType) { + this.upsertType = upsertType; + return this; + } + + public BulkInsertRequestBuilder records(ArrayList records){ + this.records = records; + return this; + } + + public BulkInsertRequest build() { + return new BulkInsertRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertResponse.java new file mode 100644 index 00000000..72f542d0 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkInsertResponse.java @@ -0,0 +1,68 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class BulkInsertResponse { + // These members will be included in the toString() output + @Expose(serialize = true) + private Summary summary; + @Expose(serialize = true) + private List success; + @Expose(serialize = true) + private List errors; + + // Internal fields. Should not be included in toString() output + private ArrayList originalPayload; + private ArrayList recordsToRetry; + + public BulkInsertResponse(List successRecords, List errorRecords) { + this.success = successRecords; + this.errors = errorRecords; + } + + public BulkInsertResponse( + List successRecords, + List errorRecords, + ArrayList originalPayload + ) { + this.success = successRecords; + this.errors = errorRecords; + this.originalPayload = originalPayload; + this.summary = new Summary(this.originalPayload.size(), this.success.size(), this.errors.size()); + } + + public Summary getSummary() { + return this.summary; + } + + public List getSuccess() { + return this.success; + } + + public List getErrors() { + return this.errors; + } + + public ArrayList getRecordsToRetry() { + if (recordsToRetry == null) { + recordsToRetry = new ArrayList<>(); + recordsToRetry = errors.stream() + .filter(error -> (error.getCode() >= 500 && error.getCode() <= 599) && error.getCode() != 529) + .map(errorRecord -> originalPayload.get(errorRecord.getIndex())) + .collect(Collectors.toCollection(ArrayList::new)); + } + return recordsToRetry; + } + + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenGroupRedactions.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenGroupRedactions.java new file mode 100644 index 00000000..da894232 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenGroupRedactions.java @@ -0,0 +1,39 @@ +package com.skyflow.vault.data; + +public class BulkTokenGroupRedactions { + private final BulkTokenGroupRedactionsBuilder builder; + + private BulkTokenGroupRedactions(BulkTokenGroupRedactionsBuilder builder) { + this.builder = builder; + } + public String getTokenGroupName() { + return this.builder.tokenGroupName; + } + + public String getRedaction() { + return this.builder.redaction; + } + + public static BulkTokenGroupRedactionsBuilder builder() { + return new BulkTokenGroupRedactionsBuilder(); + } + + public static final class BulkTokenGroupRedactionsBuilder { + private String tokenGroupName; + private String redaction; + + public BulkTokenGroupRedactionsBuilder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public BulkTokenGroupRedactionsBuilder redaction(String redaction) { + this.redaction = redaction; + return this; + } + + public BulkTokenGroupRedactions build() { + return new BulkTokenGroupRedactions(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRecord.java new file mode 100644 index 00000000..5275e8db --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRecord.java @@ -0,0 +1,44 @@ +package com.skyflow.vault.data; + +import java.util.List; + +public class BulkTokenizeRecord { + private final BulkTokenizeRecordBuilder builder; + + private BulkTokenizeRecord(BulkTokenizeRecordBuilder builder) { + this.builder = builder; + } + + public static BulkTokenizeRecordBuilder builder() { + return new BulkTokenizeRecordBuilder(); + } + + public Object getValue() { + return this.builder.value; + } + + public List getTokenGroupNames() { + return this.builder.tokenGroupNames; + } + + public static final class BulkTokenizeRecordBuilder { + private Object value; + private List tokenGroupNames; + + private BulkTokenizeRecordBuilder() {} + + public BulkTokenizeRecordBuilder value(Object value) { + this.value = value; + return this; + } + + public BulkTokenizeRecordBuilder tokenGroupNames(List tokenGroupNames) { + this.tokenGroupNames = tokenGroupNames; + return this; + } + + public BulkTokenizeRecord build() { + return new BulkTokenizeRecord(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRequest.java new file mode 100644 index 00000000..47f2ef36 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeRequest.java @@ -0,0 +1,34 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; + +public class BulkTokenizeRequest { + private final BulkTokenizeRequestBuilder builder; + + private BulkTokenizeRequest(BulkTokenizeRequestBuilder builder) { + this.builder = builder; + } + + public static BulkTokenizeRequestBuilder builder() { + return new BulkTokenizeRequestBuilder(); + } + + public ArrayList getData() { + return this.builder.data; + } + + public static final class BulkTokenizeRequestBuilder { + private ArrayList data; + + private BulkTokenizeRequestBuilder() {} + + public BulkTokenizeRequestBuilder data(ArrayList data) { + this.data = data; + return this; + } + + public BulkTokenizeRequest build() { + return new BulkTokenizeRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeResponse.java new file mode 100644 index 00000000..84026905 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/BulkTokenizeResponse.java @@ -0,0 +1,80 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class BulkTokenizeResponse { + @Expose(serialize = true) + private TokenizeSummary summary; + + @Expose(serialize = true) + private List success; + + @Expose(serialize = true) + private List errors; + + private List originalPayload; + + public BulkTokenizeResponse(List success, List errors) { + this.success = success; + this.errors = errors; + } + + public BulkTokenizeResponse(List success, List errors, List originalPayload) { + this.success = success; + this.errors = errors; + this.originalPayload = originalPayload; + + int totalTokens = originalPayload.size(); + + // Collect indices that appear in success and in errors + Set successIndices = new HashSet<>(); + for (TokenizeSuccess s : this.success) { + successIndices.add(s.getIndex()); + } + Set errorIndices = new HashSet<>(); + for (ErrorRecord e : this.errors) { + errorIndices.add(e.getIndex()); + } + + // totalTokenized = ALL token groups succeeded (in success, NOT in errors) + // totalPartial = SOME succeeded, SOME failed (in both success AND errors) + // totalFailed = ALL token groups failed (in errors, NOT in success) + int totalTokenized = 0; + int totalPartial = 0; + int totalFailed = 0; + for (int i = 0; i < totalTokens; i++) { + boolean hasSuccess = successIndices.contains(i); + boolean hasError = errorIndices.contains(i); + if (hasSuccess && !hasError) totalTokenized++; + else if (hasSuccess && hasError) totalPartial++; + else if (!hasSuccess && hasError) totalFailed++; + // else: index not present in either (shouldn't happen in practice) + } + + this.summary = new TokenizeSummary(totalTokens, totalTokenized, totalPartial, totalFailed); + } + + public TokenizeSummary getSummary() { + return summary; + } + + public List getSuccess() { + return success; + } + + public List getErrors() { + return errors; + } + + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensOptions.java b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensOptions.java new file mode 100644 index 00000000..622f531e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensOptions.java @@ -0,0 +1,30 @@ +package com.skyflow.vault.data; + +public final class DeleteTokensOptions { + private final RequestInterceptor interceptor; + + private DeleteTokensOptions(Builder builder) { + this.interceptor = builder.interceptor; + } + + public RequestInterceptor getInterceptor() { + return interceptor; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private RequestInterceptor interceptor; + + public Builder interceptor(RequestInterceptor interceptor) { + this.interceptor = interceptor; + return this; + } + + public DeleteTokensOptions build() { + return new DeleteTokensOptions(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensRequest.java new file mode 100644 index 00000000..ea8e9a7a --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensRequest.java @@ -0,0 +1,34 @@ +package com.skyflow.vault.data; + +import java.util.List; + +public class DeleteTokensRequest { + private final DeleteTokensRequestBuilder builder; + + private DeleteTokensRequest(DeleteTokensRequestBuilder builder) { + this.builder = builder; + } + + public static DeleteTokensRequestBuilder builder() { + return new DeleteTokensRequestBuilder(); + } + + public List getTokens() { + return this.builder.tokens; + } + + public static final class DeleteTokensRequestBuilder { + private List tokens; + + private DeleteTokensRequestBuilder() {} + + public DeleteTokensRequestBuilder tokens(List tokens) { + this.tokens = tokens; + return this; + } + + public DeleteTokensRequest build() { + return new DeleteTokensRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensResponse.java new file mode 100644 index 00000000..7f621d8d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensResponse.java @@ -0,0 +1,22 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DeleteTokensResponse { + private final List tokens; + private final ArrayList> errors; + + public DeleteTokensResponse(List tokens, ArrayList> errors) { + this.tokens = tokens; + this.errors = errors; + } + + public List getTokens() { + return tokens; + } + public ArrayList> getErrors(){ + return this.errors; + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSuccess.java b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSuccess.java new file mode 100644 index 00000000..15da5a46 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSuccess.java @@ -0,0 +1,31 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +public class DeleteTokensSuccess { + @Expose(serialize = true) + private int index; + + @Expose(serialize = true) + private String token; + + public DeleteTokensSuccess(int index, String token) { + this.index = index; + this.token = token; + } + + public int getIndex() { + return index; + } + + public String getToken() { + return token; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSummary.java b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSummary.java new file mode 100644 index 00000000..92770caf --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DeleteTokensSummary.java @@ -0,0 +1,41 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +public class DeleteTokensSummary { + @Expose(serialize = true) + private int totalTokens; + + @Expose(serialize = true) + private int totalDeleted; + + @Expose(serialize = true) + private int totalFailed; + + public DeleteTokensSummary() {} + + public DeleteTokensSummary(int totalTokens, int totalDeleted, int totalFailed) { + this.totalTokens = totalTokens; + this.totalDeleted = totalDeleted; + this.totalFailed = totalFailed; + } + + public int getTotalTokens() { + return totalTokens; + } + + public int getTotalDeleted() { + return totalDeleted; + } + + public int getTotalFailed() { + return totalFailed; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeData.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeData.java new file mode 100644 index 00000000..dcd8a2c8 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeData.java @@ -0,0 +1,8 @@ +package com.skyflow.vault.data; + + +public class DetokenizeData extends BaseDetokenizeData { + public DetokenizeData(String token) { + super(token); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeOptions.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeOptions.java new file mode 100644 index 00000000..267bd9bd --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeOptions.java @@ -0,0 +1,30 @@ +package com.skyflow.vault.data; + +public final class DetokenizeOptions { + private final RequestInterceptor interceptor; + + private DetokenizeOptions(Builder builder) { + this.interceptor = builder.interceptor; + } + + public RequestInterceptor getInterceptor() { + return interceptor; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private RequestInterceptor interceptor; + + public Builder interceptor(RequestInterceptor interceptor) { + this.interceptor = interceptor; + return this; + } + + public DetokenizeOptions build() { + return new DetokenizeOptions(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRecordResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRecordResponse.java new file mode 100644 index 00000000..27063e8e --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRecordResponse.java @@ -0,0 +1,37 @@ +package com.skyflow.vault.data; + + +import com.google.gson.Gson; + +import java.util.Map; + +public class DetokenizeRecordResponse extends BaseDetokenizeRecordResponse { + private String tokenGroupName; + private Map metadata; + private Object value; + + public DetokenizeRecordResponse(String token, Object value, String error, String tokenGroupName, Map metadata) { + super(token, error); + this.value = value; + this.tokenGroupName = tokenGroupName; + this.metadata = metadata; + + } + + public String getTokenGroupName() { + return tokenGroupName; + } + public Map getMetadata() { + return metadata; + } + + public Object getValue(){ + return this.value; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} \ No newline at end of file diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRequest.java new file mode 100644 index 00000000..67be6140 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeRequest.java @@ -0,0 +1,41 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; +import java.util.List; + +public class DetokenizeRequest extends BaseDetokenizeRequest{ + private final DetokenizeRequestBuilder builder; + + private DetokenizeRequest(DetokenizeRequestBuilder builder) { + this.builder = builder; + } + + public static DetokenizeRequestBuilder builder() { + return new DetokenizeRequestBuilder(); + } + + public ArrayList getDetokenizeData() { + return this.builder.detokenizeData; + } + public List getTokenGroupRedactions(){ + return this.builder.tokenGroupRedactions; + } + + public static final class DetokenizeRequestBuilder { + private ArrayList detokenizeData; + private List tokenGroupRedactions; + + public DetokenizeRequestBuilder detokenizeData(ArrayList detokenizeData) { + this.detokenizeData = detokenizeData; + return this; + } + public DetokenizeRequestBuilder tokenGroupRedactions(List tokenGroupRedactions){ + this.tokenGroupRedactions = tokenGroupRedactions; + return this; + } + public DetokenizeRequest build() { + return new DetokenizeRequest(this); + } + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponse.java new file mode 100644 index 00000000..226b8444 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponse.java @@ -0,0 +1,29 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; + +import java.util.ArrayList; + +public class DetokenizeResponse { + private final ArrayList detokenizedFields; + private final ArrayList errors; + + public DetokenizeResponse(ArrayList detokenizedFields, ArrayList errors) { + this.detokenizedFields = detokenizedFields; + this.errors = errors; + } + + public ArrayList getDetokenizedFields() { + return detokenizedFields; + } + + public ArrayList getErrors() { + return errors; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} \ No newline at end of file diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponseObject.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponseObject.java new file mode 100644 index 00000000..0e1c57f6 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeResponseObject.java @@ -0,0 +1,63 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +import java.util.Map; + +public class DetokenizeResponseObject { + @Expose(serialize = true) + private int index; + + @Expose(serialize = true) + private String token; + @Expose(serialize = true) + private Object value; + @Expose(serialize = true) + private String tokenGroupName; + @Expose(serialize = true) + private String error; + + @Expose(serialize = true) + private Map metadata; + + public DetokenizeResponseObject(int index, String token, Object value, String tokenGroupName, String error, Map metadata) { + this.token = token; + this.value = value; + this.tokenGroupName = tokenGroupName; + this.error = error; + this.metadata = metadata; + this.index = index; + } + + public String getToken() { + return token; + } + + public Object getValue() { + return value; + } + + public String getTokenGroupName() { + return tokenGroupName; + } + + public String getError() { + return error; + } + + public int getIndex() { + return index; + } + + public Map getMetadata() { + return metadata; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } + +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeSummary.java b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeSummary.java new file mode 100644 index 00000000..c86c1854 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/DetokenizeSummary.java @@ -0,0 +1,40 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +public class DetokenizeSummary { + @Expose(serialize = true) + private int totalTokens; + @Expose(serialize = true) + private int totalDetokenized; + @Expose(serialize = true) + private int totalFailed; + + public DetokenizeSummary() { + } + + public DetokenizeSummary(int totalTokens, int totalDetokenized, int totalFailed) { + this.totalTokens = totalTokens; + this.totalDetokenized = totalDetokenized; + this.totalFailed = totalFailed; + } + + public int getTotalTokens() { + return totalTokens; + } + + public int getTotalDetokenized() { + return totalDetokenized; + } + + public int getTotalFailed() { + return totalFailed; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/ErrorRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/ErrorRecord.java new file mode 100644 index 00000000..1536c0f9 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/ErrorRecord.java @@ -0,0 +1,51 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +public class ErrorRecord { + @Expose(serialize = true) + private int index; + @Expose(serialize = true) + private String error; + @Expose(serialize = true) + private int code; + @Expose(serialize = true) + private String requestId; + + public ErrorRecord(int index, String error, int code) { + this.index = index; + this.error = error; + this.code = code; + } + + public ErrorRecord(int index, String error, int code, String requestId) { + this.index = index; + this.error = error; + this.code = code; + this.requestId = requestId; + } + + public String getError() { + return error; + } + + public int getCode() { + return code; + } + + public int getIndex() { + return index; + } + + public String getRequestId() { + return requestId; + } + + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertOptions.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertOptions.java new file mode 100644 index 00000000..73262b98 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertOptions.java @@ -0,0 +1,30 @@ +package com.skyflow.vault.data; + +public final class InsertOptions { + private final RequestInterceptor interceptor; + + private InsertOptions(Builder builder) { + this.interceptor = builder.interceptor; + } + + public RequestInterceptor getInterceptor() { + return interceptor; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private RequestInterceptor interceptor; + + public Builder interceptor(RequestInterceptor interceptor) { + this.interceptor = interceptor; + return this; + } + + public InsertOptions build() { + return new InsertOptions(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertRecord.java new file mode 100644 index 00000000..e9cb5c08 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertRecord.java @@ -0,0 +1,68 @@ +package com.skyflow.vault.data; + +import com.skyflow.enums.UpsertType; + +import java.util.List; +import java.util.Map; + +public class InsertRecord { + private final InsertRecordBuilder builder; + + private InsertRecord(InsertRecordBuilder builder) { + this.builder = builder; + } + + // Getters + public String getTable() { + return this.builder.table; + } + + public Map getData() { + return this.builder.data; + } + + public List getUpsert() { + return this.builder.upsert; + } + + public UpsertType getUpsertType() { + return this.builder.upsertType; + } + + // Builder Class + public static final class InsertRecordBuilder{ + private String table; + private Map data; + private List upsert; + private UpsertType upsertType; + + public InsertRecordBuilder table(String table) { + this.table = table; + return this; + } + + public InsertRecordBuilder data(Map data) { + this.data = data; + return this; + } + + public InsertRecordBuilder upsert(List upsert) { + this.upsert = upsert; + return this; + } + + public InsertRecordBuilder upsertType(UpsertType upsertType) { + this.upsertType = upsertType; + return this; + } + + public InsertRecord build() { + return new InsertRecord(this); + } + } + + // Static entry point for builder + public static InsertRecordBuilder builder() { + return new InsertRecordBuilder(); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequest.java new file mode 100644 index 00000000..b4ef6b17 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertRequest.java @@ -0,0 +1,67 @@ +package com.skyflow.vault.data; +import com.skyflow.enums.UpsertType; + +import java.util.ArrayList; +import java.util.List; + +public class InsertRequest extends BaseInsertRequest { + private final InsertRequestBuilder builder; + + private InsertRequest(InsertRequestBuilder builder) { + super(builder); + this.builder = builder; + } + + public static InsertRequestBuilder builder() { + return new InsertRequestBuilder(); + } + + public List getUpsert() { + return this.builder.upsert; + } + + public UpsertType getUpsertType() { + return this.builder.upsertType; + } + + public ArrayList getRecords(){ + return this.builder.records; + } + + public static final class InsertRequestBuilder extends BaseInsertRequestBuilder { + private List upsert; + + private UpsertType upsertType; + + private ArrayList records; + + private InsertRequestBuilder() { + super(); + } + + @Override + public InsertRequestBuilder table(String table) { + super.table(table); + return this; + } + + public InsertRequestBuilder upsert(List upsert) { + this.upsert = upsert; + return this; + } + + public InsertRequestBuilder upsertType(UpsertType upsertType) { + this.upsertType = upsertType; + return this; + } + + public InsertRequestBuilder records(ArrayList records){ + this.records = records; + return this; + } + + public InsertRequest build() { + return new InsertRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/InsertResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/InsertResponse.java new file mode 100644 index 00000000..5a969d8d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/InsertResponse.java @@ -0,0 +1,10 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; +import java.util.HashMap; + +public class InsertResponse extends BaseInsertResponse{ + public InsertResponse(ArrayList> insertedFields, ArrayList> errors) { + super(insertedFields, errors); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/Success.java b/flowvault/src/main/java/com/skyflow/vault/data/Success.java new file mode 100644 index 00000000..59cdf722 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/Success.java @@ -0,0 +1,53 @@ +package com.skyflow.vault.data; +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +import java.util.List; +import java.util.Map; + +public class Success { + @Expose(serialize = true) + private int index; + @Expose(serialize = true) + private String skyflow_id; + @Expose(serialize = true) + private Map> tokens; + @Expose(serialize = true) + private Map data; + @Expose(serialize = true) + private String table; + + public int getIndex() { + return index; + } + + public Success(int index, String skyflow_id, Map> tokens, Map data, String table) { + this.index = index; + this.skyflow_id = skyflow_id; + this.tokens = tokens; + this.data = data; + this.table = table; + } + + public String getSkyflowId() { + return this.skyflow_id; + } + + public Map> getTokens() { + return this.tokens; + } + + public Map getData() { + return this.data; + } + + public String getTable(){ + return this.table; + } + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/Summary.java b/flowvault/src/main/java/com/skyflow/vault/data/Summary.java new file mode 100644 index 00000000..fb152fb2 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/Summary.java @@ -0,0 +1,42 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.annotations.Expose; + +public class Summary { + @Expose(serialize = true) + private int totalRecords; + @Expose(serialize = true) + private int totalInserted; + @Expose(serialize = true) + private int totalFailed; + + public Summary() { + } + + public Summary(int totalRecords, int totalInserted, int totalFailed) { + this.totalRecords = totalRecords; + this.totalInserted = totalInserted; + this.totalFailed = totalFailed; + } + + public int getTotalRecords() { + return totalRecords; + } + + + public int getTotalInserted() { + return totalInserted; + } + + public int getTotalFailed() { + return totalFailed; + } + + + @Override + public String toString() { + Gson gson = new Gson(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/Token.java b/flowvault/src/main/java/com/skyflow/vault/data/Token.java new file mode 100644 index 00000000..c50242bb --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/Token.java @@ -0,0 +1,23 @@ +package com.skyflow.vault.data; + +import com.google.gson.annotations.Expose; + +public class Token { + @Expose(serialize = true) + private String token; + @Expose(serialize = true) + private String tokenGroupName; + + public String getToken() { + return token; + } + + public String getTokenGroupName() { + return tokenGroupName; + } + + public Token(String token, String tokenGroupName) { + this.token = token; + this.tokenGroupName = tokenGroupName; + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenGroupRedactions.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenGroupRedactions.java new file mode 100644 index 00000000..3f89014c --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenGroupRedactions.java @@ -0,0 +1,39 @@ +package com.skyflow.vault.data; + +public class TokenGroupRedactions { + private final TokenGroupRedactionsBuilder builder; + + private TokenGroupRedactions(TokenGroupRedactionsBuilder builder) { + this.builder = builder; + } + public String getTokenGroupName() { + return this.builder.tokenGroupName; + } + + public String getRedaction() { + return this.builder.redaction; + } + + public static TokenGroupRedactionsBuilder builder() { + return new TokenGroupRedactionsBuilder(); + } + + public static final class TokenGroupRedactionsBuilder { + private String tokenGroupName; + private String redaction; + + public TokenGroupRedactionsBuilder tokenGroupName(String tokenGroupName) { + this.tokenGroupName = tokenGroupName; + return this; + } + + public TokenGroupRedactionsBuilder redaction(String redaction) { + this.redaction = redaction; + return this; + } + + public TokenGroupRedactions build() { + return new TokenGroupRedactions(this); + } + } +} \ No newline at end of file diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeData.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeData.java new file mode 100644 index 00000000..6f04ed8d --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeData.java @@ -0,0 +1,36 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class TokenizeData { + private Object value; + private Map tokens; + private int index; + + public TokenizeData(Object value, int index){ + this.value = value; + this.tokens = new LinkedHashMap<>(); + this.index = index; + } + public void addToken(String tokenGroupName, String token) { + this.tokens.put(tokenGroupName, token); + } + + public Object getValue() { + return value; + } + + public Map getTokens() { + return tokens; + } + + @Override + public String toString() { + Gson gson = new GsonBuilder().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeOptions.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeOptions.java new file mode 100644 index 00000000..2ac5bcfd --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeOptions.java @@ -0,0 +1,30 @@ +package com.skyflow.vault.data; + +public final class TokenizeOptions { + private final RequestInterceptor interceptor; + + private TokenizeOptions(Builder builder) { + this.interceptor = builder.interceptor; + } + + public RequestInterceptor getInterceptor() { + return interceptor; + } + + public static Builder builder() { + return new Builder(); + } + + public static final class Builder { + private RequestInterceptor interceptor; + + public Builder interceptor(RequestInterceptor interceptor) { + this.interceptor = interceptor; + return this; + } + + public TokenizeOptions build() { + return new TokenizeOptions(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRecord.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRecord.java new file mode 100644 index 00000000..faa676df --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRecord.java @@ -0,0 +1,44 @@ +package com.skyflow.vault.data; + +import java.util.List; + +public class TokenizeRecord { + private final TokenizeRecordBuilder builder; + + private TokenizeRecord(TokenizeRecordBuilder builder) { + this.builder = builder; + } + + public static TokenizeRecordBuilder builder() { + return new TokenizeRecordBuilder(); + } + + public Object getValue() { + return this.builder.value; + } + + public List getTokenGroupNames() { + return this.builder.tokenGroupNames; + } + + public static final class TokenizeRecordBuilder { + private Object value; + private List tokenGroupNames; + + private TokenizeRecordBuilder() {} + + public TokenizeRecordBuilder value(Object value) { + this.value = value; + return this; + } + + public TokenizeRecordBuilder tokenGroupNames(List tokenGroupNames) { + this.tokenGroupNames = tokenGroupNames; + return this; + } + + public TokenizeRecord build() { + return new TokenizeRecord(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRequest.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRequest.java new file mode 100644 index 00000000..a6ef8072 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeRequest.java @@ -0,0 +1,34 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; + +public class TokenizeRequest { + private final TokenizeRequestBuilder builder; + + private TokenizeRequest(TokenizeRequestBuilder builder) { + this.builder = builder; + } + + public static TokenizeRequestBuilder builder() { + return new TokenizeRequestBuilder(); + } + + public ArrayList getData() { + return this.builder.data; + } + + public static final class TokenizeRequestBuilder { + private ArrayList data; + + private TokenizeRequestBuilder() {} + + public TokenizeRequestBuilder data(ArrayList data) { + this.data = data; + return this; + } + + public TokenizeRequest build() { + return new TokenizeRequest(this); + } + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeResponse.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeResponse.java new file mode 100644 index 00000000..a4b47351 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeResponse.java @@ -0,0 +1,26 @@ +package com.skyflow.vault.data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class TokenizeResponse { + private List tokenizedData; + private final ArrayList> errors; + + public TokenizeResponse(ArrayList> errors) { + this.errors = errors; + } + public TokenizeResponse(){ + this.errors = new ArrayList<>(); + } + public List getTokenizedData(){ + return this.tokenizedData; + } + public void setTokenizedData(List tokenizedData) { + this.tokenizedData = tokenizedData; + } + public ArrayList> getErrors(){ + return this.errors; + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSuccess.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSuccess.java new file mode 100644 index 00000000..59ee4b65 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSuccess.java @@ -0,0 +1,53 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Represents one successfully tokenized input record. + * All tokens generated for this record (one per tokenGroupName) are grouped + * under the {@code tokens} map: tokenGroupName → token value. + */ +public class TokenizeSuccess { + @Expose(serialize = true) + private int index; + + @Expose(serialize = true) + private Object value; + + @Expose(serialize = true) + private Map tokens; + + public TokenizeSuccess(int index, Object value) { + this.index = index; + this.value = value; + this.tokens = new LinkedHashMap<>(); + } + + /** Adds a token for a specific token group name. */ + public void addToken(String tokenGroupName, String token) { + this.tokens.put(tokenGroupName, token); + } + + public int getIndex() { + return index; + } + + public Object getValue() { + return value; + } + + public Map getTokens() { + return tokens; + } + + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSummary.java b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSummary.java new file mode 100644 index 00000000..b9a692c0 --- /dev/null +++ b/flowvault/src/main/java/com/skyflow/vault/data/TokenizeSummary.java @@ -0,0 +1,39 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.annotations.Expose; + +public class TokenizeSummary { + @Expose(serialize = true) + private int totalTokens; + + @Expose(serialize = true) + private int totalTokenized; + + @Expose(serialize = true) + private int totalPartial; + + @Expose(serialize = true) + private int totalFailed; + + public TokenizeSummary() {} + + public TokenizeSummary(int totalTokens, int totalTokenized, int totalPartial, int totalFailed) { + this.totalTokens = totalTokens; + this.totalTokenized = totalTokenized; + this.totalPartial = totalPartial; + this.totalFailed = totalFailed; + } + + public int getTotalTokens() { return totalTokens; } + public int getTotalTokenized() { return totalTokenized; } + public int getTotalPartial() { return totalPartial; } + public int getTotalFailed() { return totalFailed; } + + @Override + public String toString() { + Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); + return gson.toJson(this); + } +} diff --git a/flowvault/src/main/resources/sdk.properties b/flowvault/src/main/resources/sdk.properties new file mode 100644 index 00000000..a33c65cd --- /dev/null +++ b/flowvault/src/main/resources/sdk.properties @@ -0,0 +1 @@ +sdk.version=${sdk.version} diff --git a/flowvault/src/test/java/com/skyflow/SkyflowTests.java b/flowvault/src/test/java/com/skyflow/SkyflowTests.java new file mode 100644 index 00000000..fc215e2b --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/SkyflowTests.java @@ -0,0 +1,168 @@ +package com.skyflow; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.Env; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.SkyflowException; +import com.skyflow.vault.controller.VaultController; +import org.junit.Assert; +import org.junit.Test; + +public class SkyflowTests { + private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + + private static VaultConfig buildConfig(String vaultId, String clusterId) { + VaultConfig config = new VaultConfig(); + config.setVaultId(vaultId); + config.setClusterId(clusterId); + config.setEnv(Env.DEV); + return config; + } + + // ── addVaultConfig ──────────────────────────────────────────────────────── + + @Test + public void testAddVaultConfig_success() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + Assert.assertEquals("vault1", client.getVaultConfig("vault1").getVaultId()); + } + + @Test + public void testAddVaultConfig_duplicateVaultIdThrows() throws SkyflowException { + Skyflow.SkyflowClientBuilder builder = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")); + try { + builder.addVaultConfig(buildConfig("vault1", "cluster2")); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testAddVaultConfig_invalidConfigThrows() { + VaultConfig config = new VaultConfig(); + // no vaultId set + try { + Skyflow.builder().addVaultConfig(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── updateVaultConfig ───────────────────────────────────────────────────── + + @Test + public void testUpdateVaultConfig_success() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + + VaultConfig update = new VaultConfig(); + update.setVaultId("vault1"); + update.setClusterId("cluster2"); + update.setEnv(Env.PROD); + client.updateVaultConfig(update); + + Assert.assertEquals("cluster2", client.getVaultConfig("vault1").getClusterId()); + Assert.assertEquals(Env.PROD, client.getVaultConfig("vault1").getEnv()); + } + + @Test + public void testUpdateVaultConfig_nonExistentVaultIdThrows() { + try { + Skyflow.builder().updateVaultConfig(buildConfig("vault-unknown", "cluster1")); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── removeVaultConfig ───────────────────────────────────────────────────── + + @Test + public void testRemoveVaultConfig_success() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + client.removeVaultConfig("vault1"); + Assert.assertNull(client.getVaultConfig("vault1")); + } + + @Test + public void testRemoveVaultConfig_nonExistentVaultIdThrows() { + try { + Skyflow.builder().removeVaultConfig("vault-unknown"); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── addSkyflowCredentials ───────────────────────────────────────────────── + + @Test + public void testAddSkyflowCredentials_success() throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setToken("some-token"); + Skyflow client = Skyflow.builder() + .addVaultConfig(buildConfig("vault1", "cluster1")) + .addSkyflowCredentials(credentials) + .build(); + Assert.assertNotNull(client); + } + + @Test + public void testAddSkyflowCredentials_invalidCredentialsThrows() { + Credentials credentials = new Credentials(); + credentials.setApiKey("not-a-valid-api-key"); + try { + Skyflow.builder().addSkyflowCredentials(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── setLogLevel / getLogLevel ───────────────────────────────────────────── + + @Test + public void testSetLogLevel_updatesLogLevel() throws SkyflowException { + Skyflow client = Skyflow.builder() + .addVaultConfig(buildConfig("vault1", "cluster1")) + .setLogLevel(LogLevel.DEBUG) + .build(); + Assert.assertEquals(LogLevel.DEBUG, client.getLogLevel()); + } + + @Test + public void testGetLogLevel_defaultsToError() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + Assert.assertEquals(LogLevel.ERROR, client.getLogLevel()); + } + + // ── vault() ─────────────────────────────────────────────────────────────── + + @Test + public void testVault_returnsVaultControllerWhenConfigured() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + VaultController controller = client.vault(); + Assert.assertNotNull(controller); + } + + @Test + public void testVault_throwsWhenNoConfigExists() { + try { + Skyflow.builder().build().vault(); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── getVaultConfig ──────────────────────────────────────────────────────── + + @Test + public void testGetVaultConfig_returnsNullForUnknownVaultId() throws SkyflowException { + Skyflow client = Skyflow.builder().addVaultConfig(buildConfig("vault1", "cluster1")).build(); + Assert.assertNull(client.getVaultConfig("vault-unknown")); + } +} diff --git a/flowvault/src/test/java/com/skyflow/VaultClientTests.java b/flowvault/src/test/java/com/skyflow/VaultClientTests.java new file mode 100644 index 00000000..24e741b5 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/VaultClientTests.java @@ -0,0 +1,130 @@ +package com.skyflow; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.Env; +import com.skyflow.errors.SkyflowException; +import org.junit.Assert; +import org.junit.Test; + +public class VaultClientTests { + + private static VaultConfig buildConfig(String vaultId, String clusterId, Credentials credentials) { + VaultConfig config = new VaultConfig(); + config.setVaultId(vaultId); + config.setClusterId(clusterId); + config.setEnv(Env.DEV); + if (credentials != null) { + config.setCredentials(credentials); + } + return config; + } + + // ── updateVaultURL priority order ──────────────────────────────────────── + + @Test + public void testUpdateVaultURL_usesExplicitVaultURLOverClusterId() throws SkyflowException { + VaultConfig config = buildConfig("vault1", "cluster1", null); + config.setVaultURL("https://custom.example.com"); + + VaultClient client = new VaultClient(config, null); + + Assert.assertEquals("https://custom.example.com", client.currentVaultURL); + } + + @Test + public void testUpdateVaultURL_constructsFromClusterIdWhenNoVaultURL() throws SkyflowException { + VaultConfig config = buildConfig("vault1", "cluster1", null); + + VaultClient client = new VaultClient(config, null); + + Assert.assertEquals("https://cluster1.skyvault.skyflowapis.dev", client.currentVaultURL); + } + + // ── setBearerToken ──────────────────────────────────────────────────────── + + @Test + public void testSetBearerToken_usesApiKeyDirectly() throws SkyflowException { + Credentials creds = new Credentials(); + creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + VaultConfig config = buildConfig("vault1", "cluster1", creds); + + VaultClient client = new VaultClient(config, null); + client.setBearerToken(); + + Assert.assertEquals("sky-ab123-abcd1234cdef1234abcd4321cdef4321", client.token); + } + + @Test + public void testSetBearerToken_reusesNonExpiredToken() throws SkyflowException { + Credentials creds = new Credentials(); + creds.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); + VaultConfig config = buildConfig("vault1", "cluster1", creds); + + VaultClient client = new VaultClient(config, null); + client.setBearerToken(); + String firstToken = client.token; + client.setBearerToken(); + + Assert.assertEquals(firstToken, client.token); + } + + @Test + public void testSetBearerToken_invalidCredentialsThrows() { + Credentials creds = new Credentials(); + creds.setApiKey("not-a-valid-api-key"); + VaultConfig config = buildConfig("vault1", "cluster1", creds); + + try { + VaultClient client = new VaultClient(config, null); + client.setBearerToken(); + Assert.fail("Should have thrown an exception"); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── getRecordsApi ───────────────────────────────────────────────────────── + + @Test + public void testGetRecordsApi_availableAfterSetBearerToken() throws SkyflowException { + Credentials creds = new Credentials(); + creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + VaultConfig config = buildConfig("vault1", "cluster1", creds); + + VaultClient client = new VaultClient(config, null); + client.setBearerToken(); + + Assert.assertNotNull(client.getRecordsApi()); + } + + // ── setCommonCredentials ────────────────────────────────────────────────── + + @Test + public void testSetCommonCredentials_vaultSpecificCredentialsTakePriority() throws SkyflowException { + Credentials vaultCreds = new Credentials(); + vaultCreds.setToken("vault-specific-token"); + VaultConfig config = buildConfig("vault1", "cluster1", vaultCreds); + + VaultClient client = new VaultClient(config, null); + Credentials commonCreds = new Credentials(); + commonCreds.setToken("common-token"); + client.setCommonCredentials(commonCreds); + client.setBearerToken(); + + Assert.assertEquals("vault-specific-token", client.token); + } + + @Test + public void testSetCommonCredentials_usedWhenNoVaultSpecificCredentials() throws SkyflowException { + VaultConfig config = buildConfig("vault1", "cluster1", null); + + VaultClient client = new VaultClient(config, null); + Credentials commonCreds = new Credentials(); + commonCreds.setToken("common-token"); + client.setCommonCredentials(commonCreds); + client.setBearerToken(); + + Assert.assertEquals("common-token", client.token); + } +} diff --git a/flowvault/src/test/java/com/skyflow/config/VaultConfigTests.java b/flowvault/src/test/java/com/skyflow/config/VaultConfigTests.java new file mode 100644 index 00000000..a1c82af5 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/config/VaultConfigTests.java @@ -0,0 +1,94 @@ +package com.skyflow.config; + +import com.skyflow.enums.Env; +import org.junit.Assert; +import org.junit.Test; + +public class VaultConfigTests { + + @Test + public void testDefaultEnvIsProd() { + VaultConfig config = new VaultConfig(); + Assert.assertEquals(Env.PROD, config.getEnv()); + } + + @Test + public void testSettingNullEnvFallsBackToProd() { + VaultConfig config = new VaultConfig(); + config.setEnv(null); + Assert.assertEquals(Env.PROD, config.getEnv()); + } + + @Test + public void testVaultIdGetterSetter() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + Assert.assertEquals("vault123", config.getVaultId()); + } + + @Test + public void testClusterIdGetterSetter() { + VaultConfig config = new VaultConfig(); + config.setClusterId("cluster123"); + Assert.assertEquals("cluster123", config.getClusterId()); + } + + @Test + public void testEnvGetterSetter() { + VaultConfig config = new VaultConfig(); + config.setEnv(Env.SANDBOX); + Assert.assertEquals(Env.SANDBOX, config.getEnv()); + } + + @Test + public void testCredentialsGetterSetter() { + VaultConfig config = new VaultConfig(); + Credentials credentials = new Credentials(); + credentials.setToken("token1"); + config.setCredentials(credentials); + Assert.assertEquals(credentials, config.getCredentials()); + } + + @Test + public void testVaultURLDefaultsToNull() { + VaultConfig config = new VaultConfig(); + Assert.assertNull(config.getVaultURL()); + } + + @Test + public void testVaultURLGetterSetter() { + VaultConfig config = new VaultConfig(); + config.setVaultURL("https://myvault.example.com"); + Assert.assertEquals("https://myvault.example.com", config.getVaultURL()); + } + + @Test + public void testClone_copiesFieldsAndDeepCopiesCredentials() throws CloneNotSupportedException { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster123"); + config.setEnv(Env.DEV); + Credentials credentials = new Credentials(); + credentials.setToken("token1"); + config.setCredentials(credentials); + + VaultConfig cloned = (VaultConfig) config.clone(); + + Assert.assertEquals(config.getVaultId(), cloned.getVaultId()); + Assert.assertEquals(config.getClusterId(), cloned.getClusterId()); + Assert.assertEquals(config.getEnv(), cloned.getEnv()); + Assert.assertNotSame(config.getCredentials(), cloned.getCredentials()); + Assert.assertEquals(config.getCredentials().getToken(), cloned.getCredentials().getToken()); + } + + @Test + public void testClone_withNullCredentials() throws CloneNotSupportedException { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster123"); + + VaultConfig cloned = (VaultConfig) config.clone(); + + Assert.assertNull(cloned.getCredentials()); + } +} diff --git a/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java new file mode 100644 index 00000000..d5214913 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/utils/UtilsTests.java @@ -0,0 +1,1150 @@ +package com.skyflow.utils; + +import com.google.gson.JsonObject; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.Env; +import com.skyflow.enums.UpsertType; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDeleteTokenRequest; +import com.skyflow.generated.rest.resources.flowservice.requests.V1FlowDetokenizeRequest; +import com.skyflow.generated.rest.resources.flowservice.requests.V1FlowTokenizeRequest; +import com.skyflow.generated.rest.resources.flowservice.requests.V1InsertRequest; +import com.skyflow.generated.rest.types.FlowEnumUpdateType; +import com.skyflow.generated.rest.types.FlowTokenizeResponseObjectToken; +import com.skyflow.generated.rest.types.V1DeleteTokenResponseObject; +import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; +import com.skyflow.generated.rest.types.V1FlowDetokenizeResponse; +import com.skyflow.generated.rest.types.V1FlowDetokenizeResponseObject; +import com.skyflow.generated.rest.types.V1FlowTokenizeResponse; +import com.skyflow.generated.rest.types.V1FlowTokenizeResponseObject; +import com.skyflow.generated.rest.types.V1InsertRecordData; +import com.skyflow.generated.rest.types.V1InsertResponse; +import com.skyflow.generated.rest.types.V1RecordResponseObject; +import com.skyflow.vault.data.BulkDeleteTokensRequest; +import com.skyflow.vault.data.BulkDeleteTokensResponse; +import com.skyflow.vault.data.BulkDetokenizeRequest; +import com.skyflow.vault.data.BulkDetokenizeResponse; +import com.skyflow.vault.data.BulkInsertRecord; +import com.skyflow.vault.data.BulkInsertRequest; +import com.skyflow.vault.data.BulkInsertResponse; +import com.skyflow.vault.data.BulkTokenGroupRedactions; +import com.skyflow.vault.data.BulkTokenizeRecord; +import com.skyflow.vault.data.BulkTokenizeRequest; +import com.skyflow.vault.data.BulkTokenizeResponse; +import com.skyflow.vault.data.DeleteTokensRequest; +import com.skyflow.vault.data.DeleteTokensResponse; +import com.skyflow.vault.data.DetokenizeData; +import com.skyflow.vault.data.DetokenizeRecordResponse; +import com.skyflow.vault.data.DetokenizeRequest; +import com.skyflow.vault.data.DetokenizeResponse; +import com.skyflow.vault.data.ErrorRecord; +import com.skyflow.vault.data.InsertRecord; +import com.skyflow.vault.data.InsertRequest; +import com.skyflow.vault.data.InsertResponse; +import com.skyflow.vault.data.TokenGroupRedactions; +import com.skyflow.vault.data.TokenizeData; +import com.skyflow.vault.data.TokenizeRecord; +import com.skyflow.vault.data.TokenizeRequest; +import com.skyflow.vault.data.TokenizeResponse; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class UtilsTests { + + // ── getVaultURL ─────────────────────────────────────────────────────────── + + @Test + public void testGetVaultURL_prodEnv() { + String url = Utils.getVaultURL("cluster1", Env.PROD); + Assert.assertEquals("https://cluster1.skyvault.skyflowapis.com", url); + } + + @Test + public void testGetVaultURL_devEnv() { + String url = Utils.getVaultURL("cluster1", Env.DEV); + Assert.assertEquals("https://cluster1.skyvault.skyflowapis.dev", url); + } + + @Test + public void testGetVaultURL_stageEnv() { + String url = Utils.getVaultURL("cluster1", Env.STAGE); + Assert.assertEquals("https://cluster1.skyvault.skyflowapis.tech", url); + } + + @Test + public void testGetVaultURL_sandboxEnv() { + String url = Utils.getVaultURL("cluster1", Env.SANDBOX); + Assert.assertEquals("https://cluster1.skyvault.skyflowapis-preview.com", url); + } + + // ── getMetrics ──────────────────────────────────────────────────────────── + + @Test + public void testGetMetrics_containsSdkVersion() { + JsonObject metrics = Utils.getMetrics(); + Assert.assertTrue(metrics.has(BaseConstants.SDK_METRIC_NAME_VERSION)); + String sdkVersionMetric = metrics.get(BaseConstants.SDK_METRIC_NAME_VERSION).getAsString(); + Assert.assertTrue(sdkVersionMetric.startsWith(Constants.SDK_METRIC_NAME_VERSION_PREFIX)); + } + + // ── getEnvVaultURL ──────────────────────────────────────────────────────── + + @Test + public void testGetEnvVaultURL_doesNotThrowUnexpectedException() { + try { + Utils.getEnvVaultURL(); + } catch (SkyflowException e) { + // acceptable if this environment happens to have an invalid VAULT_URL set + Assert.assertNotNull(e.getMessage()); + } + } + + // ── isValidURL ──────────────────────────────────────────────────────────── + + @Test + public void testIsValidURL_validHttpsUrl() { + Assert.assertTrue(Utils.isValidURL("https://example.com")); + } + + @Test + public void testIsValidURL_httpUrlIsInvalid() { + Assert.assertFalse(Utils.isValidURL("http://example.com")); + } + + @Test + public void testIsValidURL_malformedUrl() { + Assert.assertFalse(Utils.isValidURL("not a url")); + } + + // ── generateBearerToken ─────────────────────────────────────────────────── + + @Test + public void testGenerateBearerToken_withDirectToken() throws SkyflowException { + Credentials credentials = new Credentials(); + credentials.setToken("direct-token-value"); + + String token = Utils.generateBearerToken(credentials); + + Assert.assertEquals("direct-token-value", token); + } + + @Test + public void testGenerateBearerToken_withInvalidCredentialsStringThrows() { + Credentials credentials = new Credentials(); + // A string that fails JSON syntax parsing (as opposed to e.g. a bare word, + // which Gson's lenient parser accepts as a JSON primitive rather than rejecting outright). + credentials.setCredentialsString("./src/test/credentials.json"); + try { + Utils.generateBearerToken(credentials); + Assert.fail("Should have thrown an exception"); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testGenerateBearerToken_withNonExistentPathThrows() { + Credentials credentials = new Credentials(); + credentials.setPath("/nonexistent/path/credentials.json"); + try { + Utils.generateBearerToken(credentials); + Assert.fail("Should have thrown an exception"); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── getBulkInsertRequestBody ────────────────────────────────────────────── + + @Test + public void testGetBulkInsertRequestBody_buildsCorrectRequest() { + Map data = new HashMap<>(); + data.put("name", "john"); + InsertRecord record = InsertRecord.builder().data(data).build(); + ArrayList records = new ArrayList<>(); + records.add(record); + InsertRequest request = InsertRequest.builder().table("table1").records(records).build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals("table1", body.getTableName().get()); + Assert.assertEquals(1, body.getRecords().get().size()); + Assert.assertEquals(data, body.getRecords().get().get(0).getData().get()); + } + + @Test + public void testGetBulkInsertRequestBody_withUpsertAtRequestLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + InsertRecord record = InsertRecord.builder().data(data).build(); + ArrayList records = new ArrayList<>(); + records.add(record); + InsertRequest request = InsertRequest.builder() + .table("table1") + .records(records) + .upsert(Collections.singletonList("email")) + .upsertType(UpsertType.UPDATE) + .build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertTrue(body.getUpsert().isPresent()); + Assert.assertEquals(Collections.singletonList("email"), body.getUpsert().get().getUniqueColumns().get()); + Assert.assertEquals(FlowEnumUpdateType.UPDATE, body.getUpsert().get().getUpdateType().get()); + } + + @Test + public void testGetBulkInsertRequestBody_withUpsertAtRecordLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + InsertRecord record = InsertRecord.builder() + .table("table1") + .data(data) + .upsert(Collections.singletonList("email")) + .upsertType(UpsertType.REPLACE) + .build(); + ArrayList records = new ArrayList<>(); + records.add(record); + InsertRequest request = InsertRequest.builder().records(records).build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertEquals("table1", body.getRecords().get().get(0).getTableName().get()); + Assert.assertTrue(body.getRecords().get().get(0).getUpsert().isPresent()); + Assert.assertEquals(FlowEnumUpdateType.REPLACE, body.getRecords().get().get(0).getUpsert().get().getUpdateType().get()); + } + + // ── buildInsertResponse ─────────────────────────────────────────────────── + + @Test + public void testBuildInsertResponse_success() { + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder() + .skyflowId("sky-id-1") + .tokens(tokens) + .build(); + V1InsertResponse res = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + + InsertResponse response = Utils.buildInsertResponse(res); + + Assert.assertEquals(1, response.getInsertedFields().size()); + Assert.assertEquals("sky-id-1", response.getInsertedFields().get(0).get("skyflowId")); + Assert.assertEquals("tok-abc", response.getInsertedFields().get(0).get("name")); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildInsertResponse_error() { + V1RecordResponseObject record = V1RecordResponseObject.builder() + .skyflowId("sky-id-1") + .tableName("table1") + .error("insert failed") + .httpCode(400) + .build(); + V1InsertResponse res = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + + InsertResponse response = Utils.buildInsertResponse(res); + + Assert.assertTrue(response.getInsertedFields().isEmpty()); + Assert.assertEquals(1, response.getErrors().size()); + Assert.assertEquals("insert failed", response.getErrors().get(0).get("error")); + Assert.assertEquals("table1", response.getErrors().get(0).get("tableName")); + Assert.assertEquals(400, response.getErrors().get(0).get("httpCode")); + } + + @Test + public void testBuildInsertResponse_nullResponse() { + InsertResponse response = Utils.buildInsertResponse(null); + Assert.assertTrue(response.getInsertedFields().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildInsertResponse_emptyResponse() { + V1InsertResponse res = V1InsertResponse.builder().build(); + InsertResponse response = Utils.buildInsertResponse(res); + Assert.assertTrue(response.getInsertedFields().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + // ── getDetokenizeRequestBody ────────────────────────────────────────────── + + @Test + public void testGetDetokenizeRequestBody_buildsCorrectRequest() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + + V1FlowDetokenizeRequest body = Utils.getDetokenizeRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals(Collections.singletonList("token1"), body.getTokens().get()); + Assert.assertFalse(body.getTokenGroupRedactions().isPresent()); + } + + @Test + public void testGetDetokenizeRequestBody_withTokenGroupRedactions() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + List groupRedactions = Collections.singletonList( + TokenGroupRedactions.builder().tokenGroupName("group1").redaction("MASKED").build()); + DetokenizeRequest request = DetokenizeRequest.builder() + .detokenizeData(data) + .tokenGroupRedactions(groupRedactions) + .build(); + + V1FlowDetokenizeRequest body = Utils.getDetokenizeRequestBody(request, "vault123"); + + Assert.assertTrue(body.getTokenGroupRedactions().isPresent()); + Assert.assertEquals("group1", body.getTokenGroupRedactions().get().get(0).getTokenGroupName().get()); + Assert.assertEquals("MASKED", body.getTokenGroupRedactions().get().get(0).getRedaction().get()); + } + + // ── buildDetokenizeResponse ─────────────────────────────────────────────── + + @Test + public void testBuildDetokenizeResponse_success() { + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1") + .value("secret-value") + .tokenGroupName("group1") + .build(); + V1FlowDetokenizeResponse res = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)) + .build(); + + DetokenizeResponse response = Utils.buildDetokenizeResponse(res); + + Assert.assertEquals(1, response.getDetokenizedFields().size()); + DetokenizeRecordResponse detokenizedField = response.getDetokenizedFields().get(0); + Assert.assertEquals("token1", detokenizedField.getToken()); + Assert.assertEquals("secret-value", detokenizedField.getValue()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildDetokenizeResponse_error() { + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1") + .error("detokenize failed") + .build(); + V1FlowDetokenizeResponse res = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)) + .build(); + + DetokenizeResponse response = Utils.buildDetokenizeResponse(res); + + Assert.assertTrue(response.getDetokenizedFields().isEmpty()); + Assert.assertEquals(1, response.getErrors().size()); + Assert.assertEquals("detokenize failed", response.getErrors().get(0).getError()); + } + + @Test + public void testBuildDetokenizeResponse_nullResponse() { + DetokenizeResponse response = Utils.buildDetokenizeResponse(null); + Assert.assertTrue(response.getDetokenizedFields().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + // ── getTokenizeRequestBody ──────────────────────────────────────────────── + + @Test + public void testGetTokenizeRequestBody_buildsCorrectRequest() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + + V1FlowTokenizeRequest body = Utils.getTokenizeRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertTrue(body.getData().isPresent()); + Assert.assertEquals(1, body.getData().get().size()); + Assert.assertEquals("value1", body.getData().get().get(0).getValue().get()); + Assert.assertEquals(Collections.singletonList("group1"), body.getData().get().get(0).getTokenGroupNames().get()); + } + + // ── buildTokenizeResponse ───────────────────────────────────────────────── + + @Test + public void testBuildTokenizeResponse_success() { + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .token("tok-abc") + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse res = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + + TokenizeResponse response = Utils.buildTokenizeResponse(res, new HashMap<>(), 1); + + Assert.assertEquals(1, response.getTokenizedData().size()); + TokenizeData data = response.getTokenizedData().get(0); + Assert.assertEquals("value1", data.getValue()); + Assert.assertEquals("tok-abc", data.getTokens().get("group1")); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildTokenizeResponse_error() { + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .error("tokenization failed") + .httpCode(400) + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse res = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + + TokenizeResponse response = Utils.buildTokenizeResponse(res, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokenizedData().isEmpty()); + Assert.assertEquals(1, response.getErrors().size()); + Map errorRecord = response.getErrors().get(0); + Assert.assertEquals("tokenization failed", errorRecord.get("error")); + Assert.assertEquals(400, errorRecord.get("httpCode")); + Assert.assertEquals("group1", errorRecord.get("tokenGroupName")); + Assert.assertEquals(0, errorRecord.get("index")); + } + + @Test + public void testBuildTokenizeResponse_mixedSuccessAndError() { + FlowTokenizeResponseObjectToken successToken = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .token("tok-abc") + .build(); + FlowTokenizeResponseObjectToken errorToken = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group2") + .error("group2 failed") + .httpCode(400) + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(java.util.Arrays.asList(successToken, errorToken)) + .build(); + V1FlowTokenizeResponse res = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + + TokenizeResponse response = Utils.buildTokenizeResponse(res, new HashMap<>(), 1); + + Assert.assertEquals(1, response.getTokenizedData().size()); + Assert.assertEquals("tok-abc", response.getTokenizedData().get(0).getTokens().get("group1")); + Assert.assertEquals(1, response.getErrors().size()); + Assert.assertEquals("group2 failed", response.getErrors().get(0).get("error")); + } + + @Test + public void testBuildTokenizeResponse_emptyResponse() { + V1FlowTokenizeResponse res = V1FlowTokenizeResponse.builder().build(); + + TokenizeResponse response = Utils.buildTokenizeResponse(res, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokenizedData().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildTokenizeResponse_nullResponse() { + TokenizeResponse response = Utils.buildTokenizeResponse(null, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokenizedData().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildTokenizeResponse_incompleteResponseDoesNotThrow() { + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .token("tok-abc") + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse res = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + + // requestedRecordCount=2 but only 1 record came back — should just warn, not throw + TokenizeResponse response = Utils.buildTokenizeResponse(res, new HashMap<>(), 2); + + Assert.assertEquals(1, response.getTokenizedData().size()); + } + + // ── getDeleteTokensRequestBody ──────────────────────────────────────────── + + @Test + public void testGetDeleteTokensRequestBody_buildsCorrectRequest() { + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + V1FlowDeleteTokenRequest body = Utils.getDeleteTokensRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals(Collections.singletonList("token1"), body.getTokens().get()); + } + + // ── buildDeleteTokensResponse ───────────────────────────────────────────── + + @Test + public void testBuildDeleteTokensResponse_success() { + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .value("token1") + .build(); + V1FlowDeleteTokenResponse res = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + + DeleteTokensResponse response = Utils.buildDeleteTokensResponse(res, new HashMap<>(), 1); + + Assert.assertEquals(Collections.singletonList("token1"), response.getTokens()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildDeleteTokensResponse_error() { + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .error("token not found") + .httpCode(404) + .build(); + V1FlowDeleteTokenResponse res = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + + DeleteTokensResponse response = Utils.buildDeleteTokensResponse(res, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokens().isEmpty()); + Assert.assertEquals(1, response.getErrors().size()); + Assert.assertEquals("token not found", response.getErrors().get(0).get("error")); + Assert.assertEquals(404, response.getErrors().get(0).get("httpCode")); + } + + @Test + public void testBuildDeleteTokensResponse_emptyResponse() { + V1FlowDeleteTokenResponse res = V1FlowDeleteTokenResponse.builder().build(); + + DeleteTokensResponse response = Utils.buildDeleteTokensResponse(res, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokens().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildDeleteTokensResponse_nullResponse() { + DeleteTokensResponse response = Utils.buildDeleteTokensResponse(null, new HashMap<>(), 1); + + Assert.assertTrue(response.getTokens().isEmpty()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBuildDeleteTokensResponse_incompleteResponseDoesNotThrow() { + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .value("token1") + .build(); + V1FlowDeleteTokenResponse res = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + + // requestedTokenCount=2 but only 1 record came back — should just warn, not throw + DeleteTokensResponse response = Utils.buildDeleteTokensResponse(res, new HashMap<>(), 2); + + Assert.assertEquals(1, response.getTokens().size()); + } + + // ── getBulkInsertRequestBody (bulk overload) ────────────────────────────── + + @Test + public void testGetBulkInsertRequestBody_bulk_buildsCorrectRequest() { + Map data = new HashMap<>(); + data.put("name", "john"); + BulkInsertRecord record = BulkInsertRecord.builder().data(data).build(); + ArrayList records = new ArrayList<>(); + records.add(record); + BulkInsertRequest request = BulkInsertRequest.builder().table("table1").records(records).build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals("table1", body.getTableName().get()); + Assert.assertEquals(1, body.getRecords().get().size()); + Assert.assertEquals(data, body.getRecords().get().get(0).getData().get()); + } + + @Test + public void testGetBulkInsertRequestBody_bulk_withUpsertAtRequestLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + BulkInsertRecord record = BulkInsertRecord.builder().data(data).build(); + ArrayList records = new ArrayList<>(); + records.add(record); + BulkInsertRequest request = BulkInsertRequest.builder() + .table("table1") + .records(records) + .upsert(Collections.singletonList("email")) + .upsertType(UpsertType.UPDATE) + .build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertTrue(body.getUpsert().isPresent()); + Assert.assertEquals(Collections.singletonList("email"), body.getUpsert().get().getUniqueColumns().get()); + Assert.assertEquals(FlowEnumUpdateType.UPDATE, body.getUpsert().get().getUpdateType().get()); + } + + @Test + public void testGetBulkInsertRequestBody_bulk_withUpsertAtRecordLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + BulkInsertRecord record = BulkInsertRecord.builder() + .table("table1") + .data(data) + .upsert(Collections.singletonList("email")) + .upsertType(UpsertType.REPLACE) + .build(); + ArrayList records = new ArrayList<>(); + records.add(record); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + + V1InsertRequest body = Utils.getBulkInsertRequestBody(request, config); + + Assert.assertEquals("table1", body.getRecords().get().get(0).getTableName().get()); + Assert.assertTrue(body.getRecords().get().get(0).getUpsert().isPresent()); + Assert.assertEquals(FlowEnumUpdateType.REPLACE, body.getRecords().get().get(0).getUpsert().get().getUpdateType().get()); + } + + // ── getBulkDetokenizeRequestBody ────────────────────────────────────────── + + @Test + public void testGetBulkDetokenizeRequestBody_buildsCorrectRequest() { + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Arrays.asList("token1", "token2")) + .build(); + + V1FlowDetokenizeRequest body = Utils.getBulkDetokenizeRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals(Arrays.asList("token1", "token2"), body.getTokens().get()); + Assert.assertFalse(body.getTokenGroupRedactions().isPresent()); + } + + @Test + public void testGetBulkDetokenizeRequestBody_withTokenGroupRedactions() { + BulkTokenGroupRedactions redaction = BulkTokenGroupRedactions.builder() + .tokenGroupName("group1") + .redaction("MASKED") + .build(); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .tokenGroupRedactions(Collections.singletonList(redaction)) + .build(); + + V1FlowDetokenizeRequest body = Utils.getBulkDetokenizeRequestBody(request, "vault123"); + + Assert.assertTrue(body.getTokenGroupRedactions().isPresent()); + Assert.assertEquals(1, body.getTokenGroupRedactions().get().size()); + Assert.assertEquals("group1", body.getTokenGroupRedactions().get().get(0).getTokenGroupName().get()); + Assert.assertEquals("MASKED", body.getTokenGroupRedactions().get().get(0).getRedaction().get()); + } + + // ── getBulkDeleteTokensRequestBody ───────────────────────────────────────── + + @Test + public void testGetBulkDeleteTokensRequestBody_buildsCorrectRequest() { + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder() + .tokens(Arrays.asList("token1", "token2")) + .build(); + + V1FlowDeleteTokenRequest body = Utils.getBulkDeleteTokensRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals(Arrays.asList("token1", "token2"), body.getTokens().get()); + } + + // ── getBulkTokenizeRequestBody ───────────────────────────────────────────── + + @Test + public void testGetBulkTokenizeRequestBody_buildsCorrectRequest() { + BulkTokenizeRecord record = BulkTokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build(); + ArrayList data = new ArrayList<>(); + data.add(record); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + + V1FlowTokenizeRequest body = Utils.getBulkTokenizeRequestBody(request, "vault123"); + + Assert.assertEquals("vault123", body.getVaultId().get()); + Assert.assertEquals(1, body.getData().get().size()); + Assert.assertEquals("value1", body.getData().get().get(0).getValue().get()); + Assert.assertEquals(Collections.singletonList("group1"), body.getData().get().get(0).getTokenGroupNames().get()); + } + + // ── createBulkInsertBatches ──────────────────────────────────────────────── + + @Test + public void testCreateBulkInsertBatches_splitsEvenly() { + List records = new ArrayList<>(); + for (int i = 0; i < 4; i++) { + records.add(V1InsertRecordData.builder().data(new HashMap<>()).build()); + } + + List> batches = Utils.createBulkInsertBatches(records, 2); + + Assert.assertEquals(2, batches.size()); + Assert.assertEquals(2, batches.get(0).size()); + Assert.assertEquals(2, batches.get(1).size()); + } + + @Test + public void testCreateBulkInsertBatches_splitsWithRemainder() { + List records = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + records.add(V1InsertRecordData.builder().data(new HashMap<>()).build()); + } + + List> batches = Utils.createBulkInsertBatches(records, 2); + + Assert.assertEquals(3, batches.size()); + Assert.assertEquals(1, batches.get(2).size()); + } + + // ── createBulkDetokenizeBatches ──────────────────────────────────────────── + + @Test + public void testCreateBulkDetokenizeBatches_splitsTokens() { + V1FlowDetokenizeRequest request = V1FlowDetokenizeRequest.builder() + .vaultId("vault123") + .tokens(Arrays.asList("t1", "t2", "t3")) + .build(); + + List batches = Utils.createBulkDetokenizeBatches(request, 2); + + Assert.assertEquals(2, batches.size()); + Assert.assertEquals(Arrays.asList("t1", "t2"), batches.get(0).getTokens().get()); + Assert.assertEquals(Collections.singletonList("t3"), batches.get(1).getTokens().get()); + Assert.assertEquals("vault123", batches.get(0).getVaultId().get()); + } + + @Test + public void testCreateBulkDetokenizeBatches_carriesTokenGroupRedactions() { + com.skyflow.generated.rest.types.V1TokenGroupRedactions redaction = + com.skyflow.generated.rest.types.V1TokenGroupRedactions.builder() + .tokenGroupName("group1") + .redaction("MASKED") + .build(); + V1FlowDetokenizeRequest request = V1FlowDetokenizeRequest.builder() + .vaultId("vault123") + .tokens(Arrays.asList("t1", "t2")) + .tokenGroupRedactions(Collections.singletonList(redaction)) + .build(); + + List batches = Utils.createBulkDetokenizeBatches(request, 5); + + Assert.assertEquals(1, batches.size()); + Assert.assertTrue(batches.get(0).getTokenGroupRedactions().isPresent()); + Assert.assertEquals("group1", batches.get(0).getTokenGroupRedactions().get().get(0).getTokenGroupName().get()); + } + + // ── createBulkDeleteTokensBatches ────────────────────────────────────────── + + @Test + public void testCreateBulkDeleteTokensBatches_splitsTokens() { + V1FlowDeleteTokenRequest request = V1FlowDeleteTokenRequest.builder() + .vaultId("vault123") + .tokens(Arrays.asList("t1", "t2", "t3")) + .build(); + + List batches = Utils.createBulkDeleteTokensBatches(request, 2); + + Assert.assertEquals(2, batches.size()); + Assert.assertEquals(Arrays.asList("t1", "t2"), batches.get(0).getTokens().get()); + Assert.assertEquals(Collections.singletonList("t3"), batches.get(1).getTokens().get()); + } + + // ── createBulkTokenizeBatches ────────────────────────────────────────────── + + @Test + public void testCreateBulkTokenizeBatches_splitsData() { + com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject obj1 = + com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject.builder().value("v1").build(); + com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject obj2 = + com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject.builder().value("v2").build(); + V1FlowTokenizeRequest request = V1FlowTokenizeRequest.builder() + .vaultId("vault123") + .data(Arrays.asList(obj1, obj2)) + .build(); + + List batches = Utils.createBulkTokenizeBatches(request, 1); + + Assert.assertEquals(2, batches.size()); + Assert.assertEquals(1, batches.get(0).getData().get().size()); + Assert.assertEquals("v1", batches.get(0).getData().get().get(0).getValue().get()); + Assert.assertEquals("v2", batches.get(1).getData().get().get(0).getValue().get()); + } + + // ── createErrorRecord ────────────────────────────────────────────────────── + + @Test + public void testCreateErrorRecord_withHttpCodeKey() { + Map recordMap = new HashMap<>(); + recordMap.put("http_code", 400); + recordMap.put("error", "bad request"); + + ErrorRecord err = Utils.createErrorRecord(recordMap, 0, "req-1"); + + Assert.assertEquals(400, err.getCode()); + Assert.assertEquals("bad request", err.getError()); + Assert.assertEquals("req-1", err.getRequestId()); + } + + @Test + public void testCreateErrorRecord_withStatusCodeKey() { + Map recordMap = new HashMap<>(); + recordMap.put("statusCode", 500); + recordMap.put("message", "server error"); + + ErrorRecord err = Utils.createErrorRecord(recordMap, 2, null); + + Assert.assertEquals(500, err.getCode()); + Assert.assertEquals("server error", err.getError()); + Assert.assertEquals(2, err.getIndex()); + } + + @Test + public void testCreateErrorRecord_nullMapReturnsNull() { + Assert.assertNull(Utils.createErrorRecord(null, 0, null)); + } + + // ── handleBulkInsertBatchException ──────────────────────────────────────── + + @Test + public void testHandleBulkInsertBatchException_apiExceptionWithRecordsBody() { + Map errorRecordMap = new HashMap<>(); + errorRecordMap.put("error", "duplicate"); + errorRecordMap.put("httpCode", 409); + Map body = new HashMap<>(); + body.put("records", Collections.singletonList(errorRecordMap)); + ApiClientApiException apiEx = new ApiClientApiException("insert failed", 409, body); + RuntimeException wrapper = new RuntimeException(apiEx); + + List batch = Collections.singletonList(V1InsertRecordData.builder().data(new HashMap<>()).build()); + List errors = Utils.handleBulkInsertBatchException(wrapper, batch, 0, 50); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(409, errors.get(0).getCode()); + Assert.assertEquals("duplicate", errors.get(0).getError()); + } + + @Test + public void testHandleBulkInsertBatchException_apiExceptionWithNoParsableBody() { + ApiClientApiException apiEx = new ApiClientApiException("insert failed", 401, "unauthorized"); + RuntimeException wrapper = new RuntimeException(apiEx); + + List batch = Arrays.asList( + V1InsertRecordData.builder().data(new HashMap<>()).build(), + V1InsertRecordData.builder().data(new HashMap<>()).build()); + List errors = Utils.handleBulkInsertBatchException(wrapper, batch, 0, 50); + + Assert.assertEquals(2, errors.size()); + Assert.assertEquals(401, errors.get(0).getCode()); + Assert.assertEquals("insert failed", errors.get(0).getError()); + } + + @Test + public void testHandleBulkInsertBatchException_genericException() { + RuntimeException ex = new RuntimeException("boom"); + List batch = Collections.singletonList(V1InsertRecordData.builder().data(new HashMap<>()).build()); + + List errors = Utils.handleBulkInsertBatchException(ex, batch, 1, 2); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(500, errors.get(0).getCode()); + Assert.assertEquals("boom", errors.get(0).getError()); + Assert.assertEquals(2, errors.get(0).getIndex()); + } + + // ── handleBulkDetokenizeBatchException ──────────────────────────────────── + + @Test + public void testHandleBulkDetokenizeBatchException_genericException() { + RuntimeException ex = new RuntimeException("boom"); + V1FlowDetokenizeRequest batch = V1FlowDetokenizeRequest.builder() + .vaultId("vault123") + .tokens(Collections.singletonList("t1")) + .build(); + + List errors = Utils.handleBulkDetokenizeBatchException(ex, batch, 0, 50); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(500, errors.get(0).getCode()); + } + + // ── handleBulkDeleteTokensBatchException ────────────────────────────────── + + @Test + public void testHandleBulkDeleteTokensBatchException_apiExceptionWithTokensBody() { + Map errorRecordMap = new HashMap<>(); + errorRecordMap.put("error", "not found"); + errorRecordMap.put("httpCode", 404); + Map body = new HashMap<>(); + body.put("tokens", Collections.singletonList(errorRecordMap)); + ApiClientApiException apiEx = new ApiClientApiException("delete failed", 404, body); + RuntimeException wrapper = new RuntimeException(apiEx); + + V1FlowDeleteTokenRequest batch = V1FlowDeleteTokenRequest.builder() + .vaultId("vault123") + .tokens(Collections.singletonList("t1")) + .build(); + List errors = Utils.handleBulkDeleteTokensBatchException(wrapper, batch, 0, 50); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(404, errors.get(0).getCode()); + Assert.assertEquals("not found", errors.get(0).getError()); + } + + @Test + public void testHandleBulkDeleteTokensBatchException_genericException() { + RuntimeException ex = new RuntimeException("boom"); + V1FlowDeleteTokenRequest batch = V1FlowDeleteTokenRequest.builder() + .vaultId("vault123") + .tokens(Collections.singletonList("t1")) + .build(); + + List errors = Utils.handleBulkDeleteTokensBatchException(ex, batch, 0, 50); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(500, errors.get(0).getCode()); + } + + // ── handleBulkTokenizeBatchException ─────────────────────────────────────── + + @Test + public void testHandleBulkTokenizeBatchException_genericException() { + RuntimeException ex = new RuntimeException("boom"); + V1FlowTokenizeRequest batch = V1FlowTokenizeRequest.builder() + .vaultId("vault123") + .data(Collections.singletonList(com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject.builder().value("v1").build())) + .build(); + + List errors = Utils.handleBulkTokenizeBatchException(ex, batch, 0, 50); + + Assert.assertEquals(1, errors.size()); + Assert.assertEquals(500, errors.get(0).getCode()); + } + + // ── formatBulkInsertResponse ─────────────────────────────────────────────── + + @Test + public void testFormatBulkInsertResponse_success() { + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder() + .skyflowId("sky-id-1") + .tokens(tokens) + .build(); + V1InsertResponse response = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + + BulkInsertResponse result = Utils.formatBulkInsertResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getSuccess().size()); + Assert.assertEquals("sky-id-1", result.getSuccess().get(0).getSkyflowId()); + Assert.assertTrue(result.getErrors().isEmpty()); + } + + @Test + public void testFormatBulkInsertResponse_errorWithMissingHttpCodeDefaultsTo500() { + V1RecordResponseObject record = V1RecordResponseObject.builder() + .error("insert failed") + .build(); + V1InsertResponse response = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + + BulkInsertResponse result = Utils.formatBulkInsertResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getErrors().size()); + Assert.assertEquals(500, result.getErrors().get(0).getCode()); + Assert.assertEquals("insert failed", result.getErrors().get(0).getError()); + } + + @Test + public void testFormatBulkInsertResponse_nullResponseReturnsNull() { + Assert.assertNull(Utils.formatBulkInsertResponse(null, 0, 50, new HashMap<>())); + } + + // ── formatBulkDetokenizeResponse ─────────────────────────────────────────── + + @Test + public void testFormatBulkDetokenizeResponse_success() { + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1") + .value("secret-value") + .build(); + V1FlowDetokenizeResponse response = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)) + .build(); + + BulkDetokenizeResponse result = Utils.formatBulkDetokenizeResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getSuccess().size()); + Assert.assertEquals("secret-value", result.getSuccess().get(0).getValue()); + Assert.assertTrue(result.getErrors().isEmpty()); + } + + @Test + public void testFormatBulkDetokenizeResponse_errorWithMissingHttpCodeDefaultsTo500() { + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1") + .error("token not found") + .build(); + V1FlowDetokenizeResponse response = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)) + .build(); + + BulkDetokenizeResponse result = Utils.formatBulkDetokenizeResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getErrors().size()); + Assert.assertEquals(500, result.getErrors().get(0).getCode()); + } + + @Test + public void testFormatBulkDetokenizeResponse_emptyResponseReturnsNull() { + V1FlowDetokenizeResponse response = V1FlowDetokenizeResponse.builder().build(); + Assert.assertNull(Utils.formatBulkDetokenizeResponse(response, 0, 50, new HashMap<>())); + } + + // ── formatBulkDeleteTokensResponse ───────────────────────────────────────── + + @Test + public void testFormatBulkDeleteTokensResponse_success() { + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .value("token1") + .build(); + V1FlowDeleteTokenResponse response = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + + BulkDeleteTokensResponse result = Utils.formatBulkDeleteTokensResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getSuccess().size()); + Assert.assertEquals("token1", result.getSuccess().get(0).getToken()); + Assert.assertTrue(result.getErrors().isEmpty()); + } + + @Test + public void testFormatBulkDeleteTokensResponse_error() { + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .error("token not found") + .httpCode(404) + .build(); + V1FlowDeleteTokenResponse response = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + + BulkDeleteTokensResponse result = Utils.formatBulkDeleteTokensResponse(response, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getErrors().size()); + Assert.assertEquals(404, result.getErrors().get(0).getCode()); + } + + @Test + public void testFormatBulkDeleteTokensResponse_emptyResponseReturnsNull() { + V1FlowDeleteTokenResponse response = V1FlowDeleteTokenResponse.builder().build(); + Assert.assertNull(Utils.formatBulkDeleteTokensResponse(response, 0, 50, new HashMap<>())); + } + + // ── formatBulkTokenizeResponse ───────────────────────────────────────────── + + @Test + public void testFormatBulkTokenizeResponse_success() { + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .token("tok-abc") + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse response = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + V1FlowTokenizeRequest batchRequest = V1FlowTokenizeRequest.builder() + .vaultId("vault123") + .data(Collections.singletonList(com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject.builder().value("value1").build())) + .build(); + + BulkTokenizeResponse result = Utils.formatBulkTokenizeResponse(response, batchRequest, 0, 50, new HashMap<>()); + + Assert.assertEquals(1, result.getSuccess().size()); + Assert.assertEquals("tok-abc", result.getSuccess().get(0).getTokens().get("group1")); + Assert.assertTrue(result.getErrors().isEmpty()); + } + + @Test + public void testFormatBulkTokenizeResponse_tokenError() { + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .error("invalid value") + .httpCode(400) + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse response = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + V1FlowTokenizeRequest batchRequest = V1FlowTokenizeRequest.builder() + .vaultId("vault123") + .data(Collections.singletonList(com.skyflow.generated.rest.types.V1FlowTokenizeRequestObject.builder().value("value1").build())) + .build(); + + BulkTokenizeResponse result = Utils.formatBulkTokenizeResponse(response, batchRequest, 0, 50, new HashMap<>()); + + Assert.assertTrue(result.getSuccess().isEmpty()); + Assert.assertEquals(1, result.getErrors().size()); + Assert.assertEquals(400, result.getErrors().get(0).getCode()); + } + + @Test + public void testFormatBulkTokenizeResponse_emptyResponseReturnsNull() { + V1FlowTokenizeResponse response = V1FlowTokenizeResponse.builder().build(); + V1FlowTokenizeRequest batchRequest = V1FlowTokenizeRequest.builder().vaultId("vault123").build(); + Assert.assertNull(Utils.formatBulkTokenizeResponse(response, batchRequest, 0, 50, new HashMap<>())); + } +} diff --git a/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java new file mode 100644 index 00000000..72ae2293 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/utils/validations/ValidationsTests.java @@ -0,0 +1,1124 @@ +package com.skyflow.utils.validations; + +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.Env; +import com.skyflow.errors.SkyflowException; +import com.skyflow.vault.data.BulkDeleteTokensRequest; +import com.skyflow.vault.data.BulkInsertRecord; +import com.skyflow.vault.data.BulkInsertRequest; +import com.skyflow.vault.data.BulkDetokenizeRequest; +import com.skyflow.vault.data.BulkTokenGroupRedactions; +import com.skyflow.vault.data.BulkTokenizeRecord; +import com.skyflow.vault.data.BulkTokenizeRequest; +import com.skyflow.vault.data.DeleteTokensRequest; +import com.skyflow.vault.data.DetokenizeData; +import com.skyflow.vault.data.DetokenizeRequest; +import com.skyflow.vault.data.InsertRecord; +import com.skyflow.vault.data.InsertRequest; +import com.skyflow.vault.data.TokenGroupRedactions; +import com.skyflow.vault.data.TokenizeRecord; +import com.skyflow.vault.data.TokenizeRequest; +import org.junit.Assert; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ValidationsTests { + private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + + // ── validateTokenizeRequest ────────────────────────────────────────────── + + @Test + public void testValidateTokenizeRequest_nullRequest() { + try { + Validations.validateTokenizeRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_nullData() { + TokenizeRequest request = TokenizeRequest.builder().data(null).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_emptyData() { + TokenizeRequest request = TokenizeRequest.builder().data(new ArrayList<>()).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_largeValidListDoesNotThrow() { + ArrayList records = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + records.add(TokenizeRecord.builder() + .value("value" + i) + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + } + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateTokenizeRequest_nullRecordInList() { + ArrayList records = new ArrayList<>(); + records.add(null); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_nullValue() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder().value(null).tokenGroupNames(Collections.singletonList("group1")).build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_blankStringValue() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder().value(" ").tokenGroupNames(Collections.singletonList("group1")).build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_nullTokenGroupNames() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder().value("value1").tokenGroupNames(null).build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_emptyTokenGroupNames() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder().value("value1").tokenGroupNames(new ArrayList<>()).build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_blankTokenGroupNameAtIndex() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Arrays.asList("group1", " ")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateTokenizeRequest_validRequest() { + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + try { + Validations.validateTokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateDeleteTokensRequest ────────────────────────────────────────── + + @Test + public void testValidateDeleteTokensRequest_nullRequest() { + try { + Validations.validateDeleteTokensRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDeleteTokensRequest_nullTokens() { + DeleteTokensRequest request = DeleteTokensRequest.builder().tokens(null).build(); + try { + Validations.validateDeleteTokensRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDeleteTokensRequest_emptyTokens() { + DeleteTokensRequest request = DeleteTokensRequest.builder().tokens(new ArrayList<>()).build(); + try { + Validations.validateDeleteTokensRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDeleteTokensRequest_largeValidListDoesNotThrow() { + List tokens = new ArrayList<>(); + for (int i = 0; i < 100; i++) { + tokens.add("token" + i); + } + DeleteTokensRequest request = DeleteTokensRequest.builder().tokens(tokens).build(); + try { + Validations.validateDeleteTokensRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateDeleteTokensRequest_blankTokenAtIndex() { + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Arrays.asList("token1", " ")) + .build(); + try { + Validations.validateDeleteTokensRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDeleteTokensRequest_validRequest() { + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + try { + Validations.validateDeleteTokensRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateCredentials ─────────────────────────────────────────────────── + + @Test + public void testValidateCredentials_validToken() { + Credentials credentials = new Credentials(); + credentials.setToken("some-token"); + try { + Validations.validateCredentials(credentials); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateCredentials_validApiKey() { + Credentials credentials = new Credentials(); + credentials.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + try { + Validations.validateCredentials(credentials); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateCredentials_invalidApiKeyFormat() { + Credentials credentials = new Credentials(); + credentials.setApiKey("not-a-valid-api-key"); + try { + Validations.validateCredentials(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateCredentials_noAuthMeansPassed() { + Credentials credentials = new Credentials(); + try { + Validations.validateCredentials(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateCredentials_multipleAuthMeansPassed() { + Credentials credentials = new Credentials(); + credentials.setToken("some-token"); + credentials.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + try { + Validations.validateCredentials(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateCredentials_emptyRoles() { + Credentials credentials = new Credentials(); + credentials.setToken("some-token"); + credentials.setRoles(new ArrayList<>()); + try { + Validations.validateCredentials(credentials); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── validateVaultConfiguration ──────────────────────────────────────────── + + @Test + public void testValidateVaultConfiguration_nullVaultId() { + VaultConfig config = new VaultConfig(); + config.setClusterId("cluster1"); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_emptyVaultId() { + VaultConfig config = new VaultConfig(); + config.setVaultId(" "); + config.setClusterId("cluster1"); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_neitherVaultUrlNorClusterId() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_emptyClusterId() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId(" "); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_emptyVaultUrl() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster1"); + config.setVaultURL(" "); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_invalidVaultUrlFormat() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setVaultURL("http://not-https.example.com"); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateVaultConfiguration_validWithClusterId() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster1"); + config.setEnv(Env.DEV); + try { + Validations.validateVaultConfiguration(config); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateVaultConfiguration_validWithVaultUrl() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setVaultURL("https://myvault.example.com"); + try { + Validations.validateVaultConfiguration(config); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateVaultConfiguration_delegatesToCredentialValidation() { + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster1"); + Credentials credentials = new Credentials(); + credentials.setApiKey("not-a-valid-api-key"); + config.setCredentials(credentials); + try { + Validations.validateVaultConfiguration(config); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── validateInsertRequest ───────────────────────────────────────────────── + + @Test + public void testValidateInsertRequest_nullRecords() { + InsertRequest request = InsertRequest.builder().table("table1").records(null).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_emptyRecords() { + InsertRequest request = InsertRequest.builder().table("table1").records(new ArrayList<>()).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_nullRecordInList() { + ArrayList records = new ArrayList<>(); + records.add(null); + InsertRequest request = InsertRequest.builder().table("table1").records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_tableSpecifiedAtBothPlaces() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("recordTable").data(data).build()); + InsertRequest request = InsertRequest.builder().table("requestTable").records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_tableMissingAtBothPlaces() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_upsertAtRecordLevelWhenTableAtRequestLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().data(data).upsert(Collections.singletonList("email")).build()); + InsertRequest request = InsertRequest.builder() + .table("table1") + .records(records) + .build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_emptyUpsertAtRequestLevel() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().data(data).build()); + InsertRequest request = InsertRequest.builder() + .table("table1") + .records(records) + .upsert(new ArrayList<>()) + .build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_emptyOrNullKeyInData() { + Map data = new HashMap<>(); + data.put("", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_emptyOrNullValueInData() { + Map data = new HashMap<>(); + data.put("name", ""); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateInsertRequest_validRequest() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + try { + Validations.validateInsertRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateDetokenizeRequest ───────────────────────────────────────────── + + @Test + public void testValidateDetokenizeRequest_nullRequest() { + try { + Validations.validateDetokenizeRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_nullDetokenizeData() { + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(null).build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_emptyDetokenizeData() { + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(new ArrayList<>()).build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_nullEntryInDetokenizeData() { + ArrayList data = new ArrayList<>(); + data.add(null); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_blankTokenInDetokenizeData() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData(" ")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_nullTokenGroupRedactionInList() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + List groupRedactions = new ArrayList<>(); + groupRedactions.add(null); + DetokenizeRequest request = DetokenizeRequest.builder() + .detokenizeData(data) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_blankTokenGroupNameInRedaction() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + List groupRedactions = Collections.singletonList( + TokenGroupRedactions.builder().tokenGroupName(" ").redaction("MASKED").build()); + DetokenizeRequest request = DetokenizeRequest.builder() + .detokenizeData(data) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_blankRedactionInGroup() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + List groupRedactions = Collections.singletonList( + TokenGroupRedactions.builder().tokenGroupName("group1").redaction(" ").build()); + DetokenizeRequest request = DetokenizeRequest.builder() + .detokenizeData(data) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateDetokenizeRequest_validRequest() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + try { + Validations.validateDetokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateDetokenizeRequest_validRequestWithTokenGroupRedactions() { + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + List groupRedactions = Collections.singletonList( + TokenGroupRedactions.builder().tokenGroupName("group1").redaction("MASKED").build()); + DetokenizeRequest request = DetokenizeRequest.builder() + .detokenizeData(data) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateDetokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateBulkInsertRequest ────────────────────────────────────────────── + + @Test + public void testValidateBulkInsertRequest_nullRecords() { + BulkInsertRequest request = BulkInsertRequest.builder().records(null).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_emptyRecords() { + BulkInsertRequest request = BulkInsertRequest.builder().records(new ArrayList<>()).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_nullRecordInList() { + ArrayList records = new ArrayList<>(); + records.add(null); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_tableSpecifiedAtBothPlaces() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().table("table1").records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_tableNotSpecifiedAnywhere() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_emptyKeyInData() { + Map data = new HashMap<>(); + data.put("", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_emptyValueInData() { + Map data = new HashMap<>(); + data.put("name", ""); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkInsertRequest_validRequest() { + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateBulkInsertRequest_validRequestOver10000Records() { + // Bulk operations rely on batching, not a hard cap — must not throw for large lists. + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + for (int i = 0; i < 10001; i++) { + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + } + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + try { + Validations.validateBulkInsertRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateBulkDetokenizeRequest ────────────────────────────────────────── + + @Test + public void testValidateBulkDetokenizeRequest_nullRequest() { + try { + Validations.validateBulkDetokenizeRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_nullTokens() { + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder().tokens(null).build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_emptyTokens() { + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder().tokens(new ArrayList<>()).build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_nullTokenInList() { + List tokens = new ArrayList<>(); + tokens.add(null); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder().tokens(tokens).build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_nullRedactionGroupObject() { + List groupRedactions = new ArrayList<>(); + groupRedactions.add(null); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_nullGroupNameInRedaction() { + List groupRedactions = Collections.singletonList( + BulkTokenGroupRedactions.builder().redaction("MASKED").build()); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_nullRedactionInGroup() { + List groupRedactions = Collections.singletonList( + BulkTokenGroupRedactions.builder().tokenGroupName("group1").build()); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateBulkDetokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_validRequest() { + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + try { + Validations.validateBulkDetokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateBulkDetokenizeRequest_validRequestWithRedactions() { + List groupRedactions = Collections.singletonList( + BulkTokenGroupRedactions.builder().tokenGroupName("group1").redaction("MASKED").build()); + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .tokenGroupRedactions(groupRedactions) + .build(); + try { + Validations.validateBulkDetokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateBulkDeleteTokensRequest ──────────────────────────────────────── + + @Test + public void testValidateBulkDeleteTokensRequest_nullRequest() { + try { + Validations.validateBulkDeleteTokensRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDeleteTokensRequest_emptyTokens() { + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder().tokens(new ArrayList<>()).build(); + try { + Validations.validateBulkDeleteTokensRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDeleteTokensRequest_emptyTokenInList() { + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder() + .tokens(Arrays.asList("token1", " ")) + .build(); + try { + Validations.validateBulkDeleteTokensRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkDeleteTokensRequest_validRequest() { + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + try { + Validations.validateBulkDeleteTokensRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + // ── validateBulkTokenizeRequest ──────────────────────────────────────────── + + @Test + public void testValidateBulkTokenizeRequest_nullRequest() { + try { + Validations.validateBulkTokenizeRequest(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkTokenizeRequest_emptyData() { + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(new ArrayList<>()).build(); + try { + Validations.validateBulkTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkTokenizeRequest_nullRecordInList() { + ArrayList data = new ArrayList<>(); + data.add(null); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + try { + Validations.validateBulkTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkTokenizeRequest_emptyValue() { + ArrayList data = new ArrayList<>(); + data.add(BulkTokenizeRecord.builder().value(" ").build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + try { + Validations.validateBulkTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkTokenizeRequest_emptyGroupNameInList() { + ArrayList data = new ArrayList<>(); + data.add(BulkTokenizeRecord.builder().value("value1").tokenGroupNames(Arrays.asList("group1", " ")).build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + try { + Validations.validateBulkTokenizeRequest(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testValidateBulkTokenizeRequest_validRequestWithTokenGroupNames() { + ArrayList data = new ArrayList<>(); + data.add(BulkTokenizeRecord.builder().value("value1").tokenGroupNames(Collections.singletonList("group1")).build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + try { + Validations.validateBulkTokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testValidateBulkTokenizeRequest_validRequestWithoutTokenGroupNames() { + // Unlike the non-bulk tokenize validator, tokenGroupNames is optional for bulk requests. + ArrayList data = new ArrayList<>(); + data.add(BulkTokenizeRecord.builder().value("value1").build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(data).build(); + try { + Validations.validateBulkTokenizeRequest(request); + } catch (SkyflowException e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } +} diff --git a/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java b/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java new file mode 100644 index 00000000..e0af4549 --- /dev/null +++ b/flowvault/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java @@ -0,0 +1,825 @@ +package com.skyflow.vault.controller; + +import com.skyflow.VaultClient; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.CustomHeaderKey; +import com.skyflow.enums.Env; +import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.ApiClient; +import com.skyflow.generated.rest.core.ApiClientApiException; +import com.skyflow.generated.rest.core.ApiClientException; +import com.skyflow.generated.rest.core.ApiClientHttpResponse; +import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.resources.flowservice.FlowserviceClient; +import com.skyflow.generated.rest.resources.flowservice.RawFlowserviceClient; +import com.skyflow.generated.rest.types.FlowTokenizeResponseObjectToken; +import com.skyflow.generated.rest.types.V1DeleteTokenResponseObject; +import com.skyflow.generated.rest.types.V1FlowDeleteTokenResponse; +import com.skyflow.generated.rest.types.V1FlowDetokenizeResponse; +import com.skyflow.generated.rest.types.V1FlowDetokenizeResponseObject; +import com.skyflow.generated.rest.types.V1FlowTokenizeResponse; +import com.skyflow.generated.rest.types.V1FlowTokenizeResponseObject; +import com.skyflow.generated.rest.types.V1InsertResponse; +import com.skyflow.generated.rest.types.V1RecordResponseObject; +import com.skyflow.utils.Constants; +import com.skyflow.vault.data.BulkDeleteTokensRequest; +import com.skyflow.vault.data.BulkDeleteTokensResponse; +import com.skyflow.vault.data.BulkDetokenizeRequest; +import com.skyflow.vault.data.BulkDetokenizeResponse; +import com.skyflow.vault.data.BulkInsertRecord; +import com.skyflow.vault.data.BulkInsertRequest; +import com.skyflow.vault.data.BulkInsertResponse; +import com.skyflow.vault.data.BulkTokenizeRecord; +import com.skyflow.vault.data.BulkTokenizeRequest; +import com.skyflow.vault.data.BulkTokenizeResponse; +import com.skyflow.vault.data.DeleteTokensRequest; +import com.skyflow.vault.data.DeleteTokensResponse; +import com.skyflow.vault.data.DetokenizeData; +import com.skyflow.vault.data.DetokenizeRequest; +import com.skyflow.vault.data.DetokenizeResponse; +import com.skyflow.vault.data.InsertOptions; +import com.skyflow.vault.data.InsertRecord; +import com.skyflow.vault.data.InsertRequest; +import com.skyflow.vault.data.InsertResponse; +import com.skyflow.vault.data.RequestInterceptor; +import com.skyflow.vault.data.TokenizeRecord; +import com.skyflow.vault.data.TokenizeRequest; +import com.skyflow.vault.data.TokenizeResponse; +import okhttp3.Protocol; +import okhttp3.Request; +import okhttp3.Response; +import org.junit.Assert; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +public class VaultControllerTests { + private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + + private static VaultController createControllerWithMock(ApiClient mockApiClient) throws Exception { + Credentials creds = new Credentials(); + creds.setApiKey("sky-ab123-abcd1234cdef1234abcd4321cdef4321"); + + VaultConfig config = new VaultConfig(); + config.setVaultId("vault123"); + config.setClusterId("cluster123"); + config.setEnv(Env.DEV); + + VaultController controller = new VaultController(config, creds); + Field field = VaultClient.class.getDeclaredField("apiClient"); + field.setAccessible(true); + field.set(controller, mockApiClient); + return controller; + } + + private static Response buildOkHttpResponse() { + return new Response.Builder() + .request(new Request.Builder().url("https://dummy.example.com").build()) + .protocol(Protocol.HTTP_1_1) + .code(200) + .message("OK") + .header(Constants.REQUEST_ID_HEADER_KEY, "req-test-123") + .build(); + } + + private static RawFlowserviceClient mockRawFlowservice(ApiClient mockApi) { + FlowserviceClient mockFlowservice = Mockito.mock(FlowserviceClient.class); + RawFlowserviceClient mockRaw = Mockito.mock(RawFlowserviceClient.class); + when(mockApi.flowservice()).thenReturn(mockFlowservice); + when(mockFlowservice.withRawResponse()).thenReturn(mockRaw); + return mockRaw; + } + + // ── insert ──────────────────────────────────────────────────────────────── + + @Test + public void testInsert_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder() + .skyflowId("sky-id-1") + .tokens(tokens) + .build(); + V1InsertResponse body = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.insert(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + + InsertResponse response = controller.insert(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getInsertedFields().size()); + Assert.assertEquals("sky-id-1", response.getInsertedFields().get(0).get("skyflowId")); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testInsert_apiErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.insert(any(), any())) + .thenThrow(new ApiClientApiException("insert failed", 401, "unauthorized")); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + + try { + controller.insert(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(401, e.getHttpCode()); + } + } + + @Test + public void testInsert_networkErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.insert(any(), any())) + .thenThrow(new ApiClientException("Network error executing HTTP request")); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + + try { + controller.insert(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testInsert_invalidRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + InsertRequest request = InsertRequest.builder().records(new ArrayList<>()).build(); + try { + controller.insert(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── detokenize ──────────────────────────────────────────────────────────── + + @Test + public void testDetokenize_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1") + .value("secret-value") + .build(); + V1FlowDetokenizeResponse body = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)) + .build(); + ApiClientHttpResponse httpResp = + new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.detokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + + DetokenizeResponse response = controller.detokenize(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getDetokenizedFields().size()); + Assert.assertEquals("secret-value", response.getDetokenizedFields().get(0).getValue()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testDetokenize_apiErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.detokenize(any(), any())) + .thenThrow(new ApiClientApiException("detokenize failed", 401, "unauthorized")); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + + try { + controller.detokenize(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(401, e.getHttpCode()); + } + } + + @Test + public void testDetokenize_networkErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.detokenize(any(), any())) + .thenThrow(new ApiClientException("Network error executing HTTP request")); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + + try { + controller.detokenize(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testDetokenize_nullRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.detokenize(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── tokenize ────────────────────────────────────────────────────────────── + + @Test + public void testTokenize_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1") + .token("tok-abc") + .build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1") + .tokens(Collections.singletonList(token)) + .build(); + V1FlowTokenizeResponse body = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)) + .build(); + ApiClientHttpResponse httpResp = + new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.tokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + + TokenizeResponse response = controller.tokenize(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getTokenizedData().size()); + Assert.assertEquals("tok-abc", response.getTokenizedData().get(0).getTokens().get("group1")); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testTokenize_apiErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.tokenize(any(), any())) + .thenThrow(new ApiClientApiException("tokenize failed", 401, "unauthorized")); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + + try { + controller.tokenize(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(401, e.getHttpCode()); + } + } + + @Test + public void testTokenize_networkErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.tokenize(any(), any())) + .thenThrow(new ApiClientException("Network error executing HTTP request")); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList records = new ArrayList<>(); + records.add(TokenizeRecord.builder() + .value("value1") + .tokenGroupNames(Collections.singletonList("group1")) + .build()); + TokenizeRequest request = TokenizeRequest.builder().data(records).build(); + + try { + controller.tokenize(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testTokenize_nullRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.tokenize(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── deleteTokens ────────────────────────────────────────────────────────── + + @Test + public void testDeleteTokens_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder() + .value("token1") + .build(); + V1FlowDeleteTokenResponse body = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)) + .build(); + ApiClientHttpResponse httpResp = + new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.deletetoken(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + DeleteTokensResponse response = controller.deleteTokens(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(Collections.singletonList("token1"), response.getTokens()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testDeleteTokens_apiErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.deletetoken(any(), any())) + .thenThrow(new ApiClientApiException("delete failed", 404, "not found")); + + VaultController controller = createControllerWithMock(mockApi); + + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + try { + controller.deleteTokens(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertEquals(404, e.getHttpCode()); + } + } + + @Test + public void testDeleteTokens_networkErrorThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + when(mockRaw.deletetoken(any(), any())) + .thenThrow(new ApiClientException("Network error executing HTTP request")); + + VaultController controller = createControllerWithMock(mockApi); + + DeleteTokensRequest request = DeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + try { + controller.deleteTokens(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testDeleteTokens_nullRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.deleteTokens(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + // ── insert/detokenize interceptor header wiring ────────────────────────── + + @Test + public void testInsert_interceptorAddsCustomHeader() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder().skyflowId("sky-id-1").tokens(tokens).build(); + V1InsertResponse body = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.insert(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(InsertRecord.builder().table("table1").data(data).build()); + InsertRequest request = InsertRequest.builder().records(records).build(); + + RequestInterceptor interceptor = ctx -> ctx.addHeader(CustomHeaderKey.SkyflowAccountName, "acct-name"); + InsertOptions options = InsertOptions.builder().interceptor(interceptor).build(); + + controller.insert(request, options); + + ArgumentCaptor captor = ArgumentCaptor.forClass(RequestOptions.class); + Mockito.verify(mockRaw).insert(any(), captor.capture()); + Assert.assertEquals("acct-name", captor.getValue().getHeaders().get(CustomHeaderKey.SkyflowAccountName.toString())); + } + + @Test + public void testDetokenize_noOptionsDoesNotAddCustomHeader() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1").value("secret-value").build(); + V1FlowDetokenizeResponse body = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.detokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList data = new ArrayList<>(); + data.add(new DetokenizeData("token1")); + DetokenizeRequest request = DetokenizeRequest.builder().detokenizeData(data).build(); + + controller.detokenize(request, null); + + ArgumentCaptor captor = ArgumentCaptor.forClass(RequestOptions.class); + Mockito.verify(mockRaw).detokenize(any(), captor.capture()); + Assert.assertNull(captor.getValue().getHeaders().get(CustomHeaderKey.SkyflowAccountID.toString())); + } + + // ── bulkInsert ──────────────────────────────────────────────────────────── + + @Test + public void testBulkInsert_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder().skyflowId("sky-id-1").tokens(tokens).build(); + V1InsertResponse body = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.insert(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + + BulkInsertResponse response = controller.bulkInsert(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + Assert.assertEquals("sky-id-1", response.getSuccess().get(0).getSkyflowId()); + Assert.assertTrue(response.getErrors().isEmpty()); + Assert.assertEquals(1, response.getSummary().getTotalRecords()); + Assert.assertEquals(1, response.getSummary().getTotalInserted()); + } + + @Test + public void testBulkInsert_invalidRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + BulkInsertRequest request = BulkInsertRequest.builder().records(new ArrayList<>()).build(); + try { + controller.bulkInsert(request); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testBulkInsertAsync_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder().skyflowId("sky-id-1").tokens(tokens).build(); + V1InsertResponse body = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.insert(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + + BulkInsertResponse response = controller.bulkInsertAsync(request).get(5, TimeUnit.SECONDS); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + Assert.assertEquals("sky-id-1", response.getSuccess().get(0).getSkyflowId()); + } + + @Test + public void testBulkInsert_interceptorAddsCustomHeader() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + Map tokens = new HashMap<>(); + tokens.put("name", "tok-abc"); + V1RecordResponseObject record = V1RecordResponseObject.builder().skyflowId("sky-id-1").tokens(tokens).build(); + V1InsertResponse body = V1InsertResponse.builder().records(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.insert(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + Map data = new HashMap<>(); + data.put("name", "john"); + ArrayList records = new ArrayList<>(); + records.add(BulkInsertRecord.builder().table("table1").data(data).build()); + BulkInsertRequest request = BulkInsertRequest.builder().records(records).build(); + + RequestInterceptor interceptor = ctx -> ctx.addHeader(CustomHeaderKey.SkyflowAccountID, "acct-123"); + InsertOptions options = InsertOptions.builder().interceptor(interceptor).build(); + + controller.bulkInsert(request, options); + + ArgumentCaptor captor = ArgumentCaptor.forClass(RequestOptions.class); + Mockito.verify(mockRaw).insert(any(), captor.capture()); + Assert.assertEquals("acct-123", captor.getValue().getHeaders().get(CustomHeaderKey.SkyflowAccountID.toString())); + } + + // ── bulkDetokenize ──────────────────────────────────────────────────────── + + @Test + public void testBulkDetokenize_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1").value("secret-value").build(); + V1FlowDetokenizeResponse body = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.detokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + BulkDetokenizeResponse response = controller.bulkDetokenize(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + Assert.assertEquals("secret-value", response.getSuccess().get(0).getValue()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBulkDetokenize_nullRequestThrowsSkyflowExceptionNotNPE() throws Exception { + // Regression test: configureDetokenizeConcurrencyAndBatchSize() must run AFTER validation, + // otherwise detokenizeRequest.getTokens().size() NPEs on a null request before validation + // has a chance to reject it gracefully. + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.bulkDetokenize(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } catch (NullPointerException e) { + Assert.fail("Expected SkyflowException, got NullPointerException"); + } + } + + @Test + public void testBulkDetokenizeAsync_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1FlowDetokenizeResponseObject record = V1FlowDetokenizeResponseObject.builder() + .token("token1").value("secret-value").build(); + V1FlowDetokenizeResponse body = V1FlowDetokenizeResponse.builder() + .response(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.detokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + BulkDetokenizeRequest request = BulkDetokenizeRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + BulkDetokenizeResponse response = controller.bulkDetokenizeAsync(request).get(5, TimeUnit.SECONDS); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + } + + @Test + public void testBulkDetokenizeAsync_nullRequestThrowsSkyflowExceptionNotNPE() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.bulkDetokenizeAsync(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } catch (NullPointerException e) { + Assert.fail("Expected SkyflowException, got NullPointerException"); + } + } + + // ── bulkDeleteTokens ────────────────────────────────────────────────────── + + @Test + public void testBulkDeleteTokens_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder().value("token1").build(); + V1FlowDeleteTokenResponse body = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.deletetoken(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + BulkDeleteTokensResponse response = controller.bulkDeleteTokens(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + Assert.assertEquals("token1", response.getSuccess().get(0).getToken()); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBulkDeleteTokens_nullRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.bulkDeleteTokens(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testBulkDeleteTokensAsync_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + V1DeleteTokenResponseObject record = V1DeleteTokenResponseObject.builder().value("token1").build(); + V1FlowDeleteTokenResponse body = V1FlowDeleteTokenResponse.builder() + .tokens(Collections.singletonList(record)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.deletetoken(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + BulkDeleteTokensRequest request = BulkDeleteTokensRequest.builder() + .tokens(Collections.singletonList("token1")) + .build(); + + BulkDeleteTokensResponse response = controller.bulkDeleteTokensAsync(request).get(5, TimeUnit.SECONDS); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + } + + // ── bulkTokenize ────────────────────────────────────────────────────────── + + @Test + public void testBulkTokenize_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1").token("tok-abc").build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1").tokens(Collections.singletonList(token)).build(); + V1FlowTokenizeResponse body = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.tokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList records = new ArrayList<>(); + records.add(BulkTokenizeRecord.builder().value("value1").tokenGroupNames(Collections.singletonList("group1")).build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(records).build(); + + BulkTokenizeResponse response = controller.bulkTokenize(request); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + Assert.assertEquals("tok-abc", response.getSuccess().get(0).getTokens().get("group1")); + Assert.assertTrue(response.getErrors().isEmpty()); + } + + @Test + public void testBulkTokenize_nullRequestThrowsSkyflowException() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + VaultController controller = createControllerWithMock(mockApi); + try { + controller.bulkTokenize(null); + Assert.fail(EXCEPTION_NOT_THROWN); + } catch (SkyflowException e) { + Assert.assertNotNull(e.getMessage()); + } + } + + @Test + public void testBulkTokenizeAsync_success() throws Exception { + ApiClient mockApi = Mockito.mock(ApiClient.class); + RawFlowserviceClient mockRaw = mockRawFlowservice(mockApi); + + FlowTokenizeResponseObjectToken token = FlowTokenizeResponseObjectToken.builder() + .tokenGroupName("group1").token("tok-abc").build(); + V1FlowTokenizeResponseObject responseObject = V1FlowTokenizeResponseObject.builder() + .value("value1").tokens(Collections.singletonList(token)).build(); + V1FlowTokenizeResponse body = V1FlowTokenizeResponse.builder() + .response(Collections.singletonList(responseObject)).build(); + ApiClientHttpResponse httpResp = new ApiClientHttpResponse<>(body, buildOkHttpResponse()); + when(mockRaw.tokenize(any(), any())).thenReturn(httpResp); + + VaultController controller = createControllerWithMock(mockApi); + + ArrayList records = new ArrayList<>(); + records.add(BulkTokenizeRecord.builder().value("value1").tokenGroupNames(Collections.singletonList("group1")).build()); + BulkTokenizeRequest request = BulkTokenizeRequest.builder().data(records).build(); + + BulkTokenizeResponse response = controller.bulkTokenizeAsync(request).get(5, TimeUnit.SECONDS); + Assert.assertNotNull(INVALID_EXCEPTION_THROWN, response); + Assert.assertEquals(1, response.getSuccess().size()); + } +} diff --git a/pom.xml b/pom.xml index 205b5067..9dc3d230 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,9 @@ 4.0.0 com.skyflow - skyflow-java - 2.1.1 - jar + skyflow + 1.0.0 + pom ${project.groupId}:${project.artifactId} Skyflow SDK for the Java programming language @@ -25,6 +25,11 @@ skyflow + + common + v2 + flowvault + scm:git:git://github.com:skyflowapi/skyflow-java.git scm:git:ssh://github.com:skyflowapi/skyflow-java.git @@ -32,20 +37,22 @@ + true 8 8 4.12.0 2.10.1 UTF-8 4.13.2 - ${project.version} + 2.3.1 + 1.3.5 com.fasterxml.jackson.core jackson-databind - 2.18.6 + 2.17.2 compile @@ -64,7 +71,7 @@ io.github.cdimascio dotenv-java - 3.2.0 + 2.2.0 com.google.code.gson @@ -89,7 +96,6 @@ 4.13.2 test - org.powermock powermock-module-junit4 @@ -105,12 +111,6 @@ - - - src/main/resources - true - - org.apache.maven.plugins @@ -131,7 +131,8 @@ 3.2.0 - com.skyflow.generated.rest.* + com.skyflow.generated.rest.*: + com.skyflow.generated.auth.*: @@ -140,6 +141,7 @@ jar + @@ -163,28 +165,6 @@ - - org.apache.maven.plugins - maven-checkstyle-plugin - 3.3.1 - - checkstyle.xml - - false - true - - **/generated/** - - - - validate - validate - - check - - - - org.jacoco jacoco-maven-plugin @@ -255,50 +235,4 @@ https://repo.maven.apache.org/maven2/ - - - - maven-central - - - central - https://central.sonatype.com/api/v1/publisher/upload - - - central-snapshots - https://central.sonatype.com/api/v1/publisher/upload - - - - - - org.sonatype.central - central-publishing-maven-plugin - 0.4.0 - true - - central - true - true - - - - - - - jfrog - - - central - prekarilabs.jfrog.io-releases - https://prekarilabs.jfrog.io/artifactory/skyflow-java - - - snapshots - prekarilabs.jfrog.io-snapshots - https://prekarilabs.jfrog.io/artifactory/skyflow-java - - - - - + \ No newline at end of file diff --git a/scripts/bump_version.sh b/scripts/bump_version.sh index d729ea63..ccb538ba 100755 --- a/scripts/bump_version.sh +++ b/scripts/bump_version.sh @@ -1,7 +1,8 @@ # Input Arguments Version=$1 CommitHash=$2 -PomFile="$GITHUB_WORKSPACE/pom.xml" +Module=$3 +PomFile="$GITHUB_WORKSPACE/$Module/pom.xml" if [ -z "$Version" ]; then echo "Error: Version argument is required." @@ -14,27 +15,29 @@ if [ -z "$CommitHash" ]; then awk -v version="$Version" ' BEGIN { updated = 0 } + //,/<\/parent>/ { print; next } // && updated == 0 { sub(/.*<\/version>/, "" version "") updated = 1 } { print } - ' "$PomFile" > tempfile && cat tempfile > "$PomFile" && rm -f tempfile + ' "$PomFile" > tempfile && cat tempfile > "$PomFile" && rm -f tempfile echo "--------------------------" echo "Done. Main project version now at $Version" else echo "Bumping main project version to $Version-dev-$CommitHash" - awk -v version="$Version-dev.$CommitHash" ' - BEGIN { updated = 0 } - // && updated == 0 { - sub(/.*<\/version>/, "" version "") - updated = 1 - } - { print } - ' "$PomFile" > tempfile && cat tempfile > "$PomFile" && rm -f tempfile + awk -v version="$Version${CommitHash:+-dev.$CommitHash}" ' + BEGIN { updated = 0 } + //,/<\/parent>/ { print; next } + // && updated == 0 { + sub(/.*<\/version>/, "" version "") + updated = 1 + } + { print } + ' "$PomFile" > tempfile && cat tempfile > "$PomFile" && rm -f tempfile - echo "--------------------------" - echo "Done. Main project version now at $Version-dev.$CommitHash" +echo "--------------------------" +echo "Done. $Module module version now at $Version${CommitHash:+-dev.$CommitHash}" fi diff --git a/src/main/java/com/skyflow/Skyflow.java b/src/main/java/com/skyflow/Skyflow.java deleted file mode 100644 index eba8d6fd..00000000 --- a/src/main/java/com/skyflow/Skyflow.java +++ /dev/null @@ -1,314 +0,0 @@ -package com.skyflow; - -import com.skyflow.config.ConnectionConfig; -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.enums.LogLevel; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.logs.ErrorLogs; -import com.skyflow.logs.InfoLogs; -import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; -import com.skyflow.utils.validations.Validations; -import com.skyflow.vault.controller.ConnectionController; -import com.skyflow.vault.controller.DetectController; -import com.skyflow.vault.controller.VaultController; - -import java.util.LinkedHashMap; - -public final class Skyflow { - private final SkyflowClientBuilder builder; - - private Skyflow(SkyflowClientBuilder builder) { - this.builder = builder; - LogUtil.printInfoLog(InfoLogs.CLIENT_INITIALIZED.getLog()); - } - - public static SkyflowClientBuilder builder() { - return new SkyflowClientBuilder(); - } - - public Skyflow addVaultConfig(VaultConfig vaultConfig) throws SkyflowException { - this.builder.addVaultConfig(vaultConfig); - return this; - } - - public VaultConfig getVaultConfig(String vaultId) { - return this.builder.vaultConfigMap.get(vaultId); - } - - public Skyflow updateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { - this.builder.updateVaultConfig(vaultConfig); - return this; - } - - public Skyflow removeVaultConfig(String vaultId) throws SkyflowException { - this.builder.removeVaultConfig(vaultId); - return this; - } - - public Skyflow addConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { - this.builder.addConnectionConfig(connectionConfig); - return this; - } - - public ConnectionConfig getConnectionConfig(String connectionId) { - return this.builder.connectionConfigMap.get(connectionId); - } - - public Skyflow updateConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { - this.builder.updateConnectionConfig(connectionConfig); - return this; - } - - public Skyflow removeConnectionConfig(String connectionId) throws SkyflowException { - this.builder.removeConnectionConfig(connectionId); - return this; - } - - public Skyflow updateSkyflowCredentials(Credentials credentials) throws SkyflowException { - this.builder.addSkyflowCredentials(credentials); - return this; - } - - public Skyflow setLogLevel(LogLevel logLevel) { - this.builder.setLogLevel(logLevel); - return this; - } - - /** @deprecated Use {@link #setLogLevel(LogLevel)} instead. */ - @Deprecated(since = "2.1", forRemoval = true) - public Skyflow updateLogLevel(LogLevel logLevel) { - LogUtil.printWarningLog(InfoLogs.DEPRECATED_UPDATE_LOG_LEVEL.getLog()); - return setLogLevel(logLevel); - } - - public LogLevel getLogLevel() { - return this.builder.logLevel; - } - - public VaultController vault() throws SkyflowException { - Object[] array = this.builder.vaultClientsMap.keySet().toArray(); - if (array.length < 1) { - LogUtil.printErrorLog(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - String vaultId = (String) array[0]; - return this.vault(vaultId); - } - - public VaultController vault(String vaultId) throws SkyflowException { - VaultController controller = this.builder.vaultClientsMap.get(vaultId); - if (controller == null) { - LogUtil.printErrorLog(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - return controller; - } - - - public ConnectionController connection() throws SkyflowException { - Object[] array = this.builder.connectionsMap.keySet().toArray(); - if (array.length < 1) { - LogUtil.printErrorLog(ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.ConnectionIdNotInConfigList.getMessage()); - } - String connectionId = (String) array[0]; - return this.connection(connectionId); - } - - public ConnectionController connection(String connectionId) throws SkyflowException { - ConnectionController controller = this.builder.connectionsMap.get(connectionId); - if (controller == null) { - LogUtil.printErrorLog(ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.ConnectionIdNotInConfigList.getMessage()); - } - return controller; - } - - public DetectController detect() throws SkyflowException { - Object[] array = this.builder.detectClientsMap.keySet().toArray(); - if (array.length < 1) { - LogUtil.printErrorLog(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - String detectId = (String) array[0]; - return this.detect(detectId); - } - - public DetectController detect(String vaultId) throws SkyflowException { - DetectController controller = this.builder.detectClientsMap.get(vaultId); - if (controller == null) { - LogUtil.printErrorLog(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - return controller; - } - - public static final class SkyflowClientBuilder { - private final LinkedHashMap connectionsMap; - private final LinkedHashMap vaultClientsMap; - private final LinkedHashMap detectClientsMap; - private final LinkedHashMap vaultConfigMap; - private final LinkedHashMap connectionConfigMap; - private Credentials skyflowCredentials; - private LogLevel logLevel; - - public SkyflowClientBuilder() { - this.vaultClientsMap = new LinkedHashMap<>(); - this.detectClientsMap = new LinkedHashMap<>(); - this.vaultConfigMap = new LinkedHashMap<>(); - this.connectionsMap = new LinkedHashMap<>(); - this.connectionConfigMap = new LinkedHashMap<>(); - this.skyflowCredentials = null; - this.logLevel = LogLevel.ERROR; - } - - public SkyflowClientBuilder addVaultConfig(VaultConfig vaultConfig) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog()); - Validations.validateVaultConfig(vaultConfig); - if (this.vaultClientsMap.containsKey(vaultConfig.getVaultId())) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.VAULT_CONFIG_EXISTS.getLog(), vaultConfig.getVaultId() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.VaultIdAlreadyInConfigList.getMessage()); - } else { - this.vaultConfigMap.put(vaultConfig.getVaultId(), vaultConfig); - this.vaultClientsMap.put(vaultConfig.getVaultId(), new VaultController(vaultConfig, this.skyflowCredentials)); - this.detectClientsMap.put(vaultConfig.getVaultId(), new DetectController(vaultConfig, this.skyflowCredentials)); - LogUtil.printInfoLog(Utils.parameterizedString( - InfoLogs.VAULT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); - LogUtil.printInfoLog(Utils.parameterizedString( - InfoLogs.DETECT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); - } - return this; - } - - public SkyflowClientBuilder updateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.VALIDATING_VAULT_CONFIG.getLog()); - Validations.validateVaultConfig(vaultConfig); - if (this.vaultClientsMap.containsKey(vaultConfig.getVaultId())) { - VaultConfig updatedConfig = findAndUpdateVaultConfig(vaultConfig); - this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(); - } else { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultConfig.getVaultId() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - return this; - } - - public SkyflowClientBuilder removeVaultConfig(String vaultId) throws SkyflowException { - if (this.vaultClientsMap.containsKey(vaultId)) { - this.vaultClientsMap.remove(vaultId); - this.vaultConfigMap.remove(vaultId); - } else { - LogUtil.printErrorLog(Utils.parameterizedString(ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST.getLog(), vaultId)); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.VaultIdNotInConfigList.getMessage()); - } - return this; - } - - public SkyflowClientBuilder addConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.VALIDATING_CONNECTION_CONFIG.getLog()); - Validations.validateConnectionConfig(connectionConfig); - if (this.connectionsMap.containsKey(connectionConfig.getConnectionId())) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.CONNECTION_CONFIG_EXISTS.getLog(), connectionConfig.getConnectionId() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.ConnectionIdAlreadyInConfigList.getMessage()); - } else { - this.connectionConfigMap.put(connectionConfig.getConnectionId(), connectionConfig); - ConnectionController controller = new ConnectionController(connectionConfig, this.skyflowCredentials); - this.connectionsMap.put(connectionConfig.getConnectionId(), controller); - LogUtil.printInfoLog(Utils.parameterizedString( - InfoLogs.CONNECTION_CONTROLLER_INITIALIZED.getLog(), connectionConfig.getConnectionId())); - } - return this; - } - - public SkyflowClientBuilder updateConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { - LogUtil.printInfoLog(InfoLogs.VALIDATING_CONNECTION_CONFIG.getLog()); - Validations.validateConnectionConfig(connectionConfig); - if (this.connectionsMap.containsKey(connectionConfig.getConnectionId())) { - ConnectionConfig updatedConfig = findAndUpdateConnectionConfig(connectionConfig); - this.connectionsMap.get(updatedConfig.getConnectionId()).updateConnectionConfig(connectionConfig); - } else { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog(), connectionConfig.getConnectionId() - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.ConnectionIdNotInConfigList.getMessage()); - } - return this; - } - - public SkyflowClientBuilder removeConnectionConfig(String connectionId) throws SkyflowException { - if (this.connectionsMap.containsKey(connectionId)) { - this.connectionsMap.remove(connectionId); - this.connectionConfigMap.remove(connectionId); - } else { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog(), connectionId - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.ConnectionIdNotInConfigList.getMessage()); - } - return this; - } - - public SkyflowClientBuilder addSkyflowCredentials(Credentials credentials) throws SkyflowException { - Validations.validateCredentials(credentials); - this.skyflowCredentials = credentials; - for (VaultController vault : this.vaultClientsMap.values()) { - vault.setCommonCredentials(this.skyflowCredentials); - } - for (DetectController detect : this.detectClientsMap.values()) { - detect.setCommonCredentials(this.skyflowCredentials); - } - for (ConnectionController connection : this.connectionsMap.values()) { - connection.setCommonCredentials(this.skyflowCredentials); - } - return this; - } - - public SkyflowClientBuilder setLogLevel(LogLevel logLevel) { - this.logLevel = logLevel == null ? LogLevel.ERROR : logLevel; - LogUtil.setupLogger(this.logLevel); - LogUtil.printInfoLog(Utils.parameterizedString( - InfoLogs.CURRENT_LOG_LEVEL.getLog(), String.valueOf(logLevel) - )); - return this; - } - - public Skyflow build() { - return new Skyflow(this); - } - - private VaultConfig findAndUpdateVaultConfig(VaultConfig vaultConfig) { - VaultConfig previousConfig = this.vaultConfigMap.get(vaultConfig.getVaultId()); - Env env = vaultConfig.getEnv() != null ? vaultConfig.getEnv() : previousConfig.getEnv(); - String clusterId = vaultConfig.getClusterId() != null ? vaultConfig.getClusterId() : previousConfig.getClusterId(); - Credentials credentials = vaultConfig.getCredentials() != null ? vaultConfig.getCredentials() : previousConfig.getCredentials(); - previousConfig.setEnv(env); - previousConfig.setClusterId(clusterId); - previousConfig.setCredentials(credentials); - return previousConfig; - } - - private ConnectionConfig findAndUpdateConnectionConfig(ConnectionConfig connectionConfig) { - ConnectionConfig previousConfig = this.connectionConfigMap.get(connectionConfig.getConnectionId()); - String connectionURL = connectionConfig.getConnectionUrl() != null ? connectionConfig.getConnectionUrl() : previousConfig.getConnectionUrl(); - Credentials credentials = connectionConfig.getCredentials() != null ? connectionConfig.getCredentials() : previousConfig.getCredentials(); - previousConfig.setConnectionUrl(connectionURL); - previousConfig.setCredentials(credentials); - return previousConfig; - } - } -} diff --git a/src/main/java/com/skyflow/utils/Constants.java b/src/main/java/com/skyflow/utils/Constants.java deleted file mode 100644 index aa3a3f14..00000000 --- a/src/main/java/com/skyflow/utils/Constants.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.skyflow.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -public final class Constants { - public static final String SECURE_PROTOCOL = "https://"; - public static final String DEV_DOMAIN = ".vault.skyflowapis.dev"; - public static final String STAGE_DOMAIN = ".vault.skyflowapis.tech"; - public static final String SANDBOX_DOMAIN = ".vault.skyflowapis-preview.com"; - public static final String PROD_DOMAIN = ".vault.skyflowapis.com"; - public static final String PKCS8_PRIVATE_HEADER = "-----BEGIN PRIVATE KEY-----"; - public static final String PKCS8_PRIVATE_FOOTER = "-----END PRIVATE KEY-----"; - public static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer"; - public static final String SIGNED_DATA_TOKEN_PREFIX = "signed_token_"; - public static final String ORDER_ASCENDING = "ASCENDING"; - public static final String API_KEY_REGEX = "^sky-[a-zA-Z0-9]{5}-[a-fA-F0-9]{32}$"; - public static final String CONTEXT_KEY_REGEX = "^[a-zA-Z0-9_]+$"; - public static final String ENV_CREDENTIALS_KEY_NAME = "SKYFLOW_CREDENTIALS"; - public static final String SDK_NAME = "Skyflow Java SDK"; - public static final String DEFAULT_SDK_VERSION = "v2"; - public static final String SDK_VERSION; - public static final String SDK_PREFIX; - public static final String SDK_METRIC_NAME_VERSION = "sdk_name_version"; - public static final String SDK_METRIC_NAME_VERSION_PREFIX = "skyflow-java@"; - public static final String SDK_METRIC_CLIENT_DEVICE_MODEL = "sdk_client_device_model"; - public static final String SDK_METRIC_CLIENT_OS_DETAILS = "sdk_client_os_details"; - public static final String SDK_METRIC_RUNTIME_DETAILS = "sdk_runtime_details"; - public static final String SDK_METRIC_RUNTIME_DETAILS_PREFIX = "Java@"; - public static final String SDK_AUTH_HEADER_KEY = "x-skyflow-authorization"; - public static final String SDK_METRICS_HEADER_KEY = "sky-metadata"; - public static final String REQUEST_ID_HEADER_KEY = "x-request-id"; - public static final String PROCESSED_FILE_NAME_PREFIX = "processed-"; - public static final String ERROR_FROM_CLIENT_HEADER_KEY = "error-from-client"; - public static final String DEIDENTIFIED_FILE_PREFIX = "deidentified"; - public static final String HTTPS_PROTOCOL = "https"; - public static final String CURLY_PLACEHOLDER = "{%s}"; - public static final String EMPTY_STRING = ""; - public static final String QUOTE = "\""; - - public static final class HttpUtilityExtra { - public static final String SDK_GENERATED_PREFIX = "SDK-Generated-"; - private HttpUtilityExtra() {} - } - - static { - String sdkVersion; - // Use a static initializer block to read the properties file - Properties properties = new Properties(); - try (InputStream input = Constants.class.getClassLoader().getResourceAsStream("sdk.properties")) { - if (input == null) { - sdkVersion = DEFAULT_SDK_VERSION; - } else { - properties.load(input); - sdkVersion = properties.getProperty("sdk.version", DEFAULT_SDK_VERSION); - } - } catch (IOException ex) { - sdkVersion = DEFAULT_SDK_VERSION; - } - SDK_VERSION = sdkVersion; - SDK_PREFIX = SDK_NAME + " " + SDK_VERSION; - } -} diff --git a/src/test/java/com/skyflow/VaultClientDotenvTests.java b/src/test/java/com/skyflow/VaultClientDotenvTests.java deleted file mode 100644 index 1a54b13d..00000000 --- a/src/test/java/com/skyflow/VaultClientDotenvTests.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.skyflow; - -import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; -import com.skyflow.enums.Env; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.utils.Constants; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; - -/** - * Tests for VaultClient's prioritiseCredentials dotenv path. - * - * These tests write a temporary .env file to exercise the code path where - * no VaultConfig credentials and no common credentials are set, so the code - * falls through to read from a .env file. - */ -public class VaultClientDotenvTests { - - private static final String ENV_FILE = ".env"; - private byte[] originalEnvContent; - - @Before - public void saveEnvFileState() throws IOException { - File f = new File(ENV_FILE); - originalEnvContent = f.exists() ? Files.readAllBytes(Paths.get(ENV_FILE)) : null; - } - - @After - public void restoreEnvFile() throws IOException { - if (originalEnvContent != null) { - Files.write(Paths.get(ENV_FILE), originalEnvContent); - } else { - Files.deleteIfExists(Paths.get(ENV_FILE)); - } - } - - private VaultClient buildClientWithNoCreds(String vaultId, String clusterId) { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultId); - config.setClusterId(clusterId); - config.setEnv(Env.DEV); - // No credentials set - return new VaultClient(config, null); - } - - /** - * Covers the dotenv success path: Dotenv.load() succeeds and returns a - * non-null credentials string, so finalCredentials is set via - * credentialsString. Lines ~862-870 of VaultClient.java. - */ - @Test - public void testPrioritiseCredentials_dotenvReturnsCredentials_setsCredentials() throws Exception { - // Write a .env file with a valid credentials string value - try (FileWriter fw = new FileWriter(ENV_FILE)) { - fw.write(Constants.ENV_CREDENTIALS_KEY_NAME + "={\"token\":\"env-token-value\"}\n"); - } - - VaultClient client = buildClientWithNoCreds("dotenv-vault-1", "cluster1"); - // updateVaultConfig() calls prioritiseCredentials() which reads from .env - // Should not throw since sysCredentials is non-null - client.updateVaultConfig(); - - // finalCredentials should be set with credentials string - java.lang.reflect.Field field = VaultClient.class.getDeclaredField("finalCredentials"); - field.setAccessible(true); - Credentials finalCreds = (Credentials) field.get(client); - Assert.assertNotNull(finalCreds); - Assert.assertEquals("{\"token\":\"env-token-value\"}", finalCreds.getCredentialsString()); - } - - /** - * Covers the path where dotenv loads but the key is absent (returns null), - * causing SkyflowException(EmptyCredentials) to be thrown directly. - * Lines ~864-876 of VaultClient.java. - */ - @Test - public void testPrioritiseCredentials_dotenvKeyMissing_throwsSkyflowException() throws Exception { - // Write a .env file WITHOUT the SKYFLOW_CREDENTIALS key - try (FileWriter fw = new FileWriter(ENV_FILE)) { - fw.write("SOME_OTHER_KEY=some_value\n"); - } - - VaultClient client = buildClientWithNoCreds("dotenv-vault-2", "cluster2"); - try { - client.updateVaultConfig(); - Assert.fail("Should have thrown SkyflowException"); - } catch (SkyflowException e) { - Assert.assertTrue(e.getMessage().contains(ErrorMessage.EmptyCredentials.getMessage())); - } catch (RuntimeException e) { - Assert.fail("Expected direct SkyflowException, not RuntimeException wrapping it"); - } - } -} diff --git a/src/test/java/com/skyflow/utils/UtilsTests.java b/src/test/java/com/skyflow/utils/UtilsTests.java deleted file mode 100644 index 4e910e15..00000000 --- a/src/test/java/com/skyflow/utils/UtilsTests.java +++ /dev/null @@ -1,219 +0,0 @@ -package com.skyflow.utils; - -import com.google.gson.JsonObject; -import com.skyflow.config.ConnectionConfig; -import com.skyflow.config.Credentials; -import com.skyflow.enums.Env; -import com.skyflow.enums.RequestMethod; -import com.skyflow.errors.ErrorCode; -import com.skyflow.errors.ErrorMessage; -import com.skyflow.errors.SkyflowException; -import com.skyflow.vault.connection.InvokeConnectionRequest; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -public class UtilsTests { - private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; - private static final String EXCEPTION_NOT_THROWN = "Should have thrown an exception"; - private static String clusterId = null; - private static String url = null; - private static String filePath = null; - private static String credentialsString = null; - private static String token = null; - private static String context = null; - private static ArrayList roles = null; - private static String connectionId = null; - private static String connectionUrl = null; - private static Map queryParams; - private static Map pathParams; - private static Map requestHeaders; - - @BeforeClass - public static void setup() { - clusterId = "test_cluster_id"; - url = "https://test-url.com/java/unit/tests"; - filePath = "invalid/file/path/credentials.json"; - credentialsString = "invalid credentials string"; - token = "invalid-token"; - context = "test_context"; - roles = new ArrayList<>(); - String role = "test_role"; - roles.add(role); - connectionId = "test_connection_id"; - connectionUrl = "https://test.connection.url"; - pathParams = new HashMap<>(); - queryParams = new HashMap<>(); - requestHeaders = new HashMap<>(); - } - - @Test - public void testGetVaultURLForDev() { - try { - String vaultURL = Utils.getVaultURL(clusterId, Env.DEV); - String devUrl = "https://test_cluster_id.vault.skyflowapis.dev"; - Assert.assertEquals(devUrl, vaultURL); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetVaultURLForStage() { - try { - String vaultURL = Utils.getVaultURL(clusterId, Env.STAGE); - String stageUrl = "https://test_cluster_id.vault.skyflowapis.tech"; - Assert.assertEquals(stageUrl, vaultURL); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetVaultURLForSandbox() { - try { - String vaultURL = Utils.getVaultURL(clusterId, Env.SANDBOX); - String sandboxUrl = "https://test_cluster_id.vault.skyflowapis-preview.com"; - Assert.assertEquals(sandboxUrl, vaultURL); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetVaultURLForProd() { - try { - String vaultURL = Utils.getVaultURL(clusterId, Env.PROD); - String prodUrl = "https://test_cluster_id.vault.skyflowapis.com"; - Assert.assertEquals(prodUrl, vaultURL); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetBaseURL() { - try { - String baseURL = Utils.getBaseURL(url); - String url = "https://test-url.com"; - Assert.assertEquals(url, baseURL); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGenerateBearerTokenWithCredentialsFile() { - try { - Credentials credentials = new Credentials(); - credentials.setPath(filePath); - credentials.setContext(context); - credentials.setRoles(roles); - Utils.generateBearerToken(credentials); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals( - Utils.parameterizedString(ErrorMessage.FileNotFound.getMessage(), filePath), - e.getMessage() - ); - } - } - - @Test - public void testGenerateBearerTokenWithCredentialsString() { - try { - Credentials credentials = new Credentials(); - credentials.setCredentialsString(credentialsString); - credentials.setContext(context); - credentials.setRoles(roles); - Utils.generateBearerToken(credentials); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.CredentialsStringInvalidJson.getMessage(), e.getMessage()); - } - } - - @Test - public void testGenerateBearerTokenWithToken() { - try { - Credentials credentials = new Credentials(); - credentials.setToken(token); - credentials.setContext(context); - credentials.setRoles(roles); - String bearerToken = Utils.generateBearerToken(credentials); - Assert.assertEquals(token, bearerToken); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testConstructConnectionURL() { - try { - queryParams.put("query_param", "value"); - pathParams.put("path_param", "value"); - - ConnectionConfig connectionConfig = new ConnectionConfig(); - connectionConfig.setConnectionId(connectionId); - connectionConfig.setConnectionUrl(connectionUrl); - - InvokeConnectionRequest request = InvokeConnectionRequest.builder() - .method(RequestMethod.POST).pathParams(pathParams).queryParams(queryParams).build(); - String filledUrl = Utils.constructConnectionURL(connectionConfig, request); - Assert.assertEquals(connectionUrl + "?" + "query_param=value", filledUrl); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testConstructConnectionHeaderMap() { - try { - requestHeaders.put("HEADER", "value"); - Map headers = Utils.constructConnectionHeadersMap(requestHeaders); - Assert.assertEquals(1, headers.size()); - Assert.assertTrue(headers.containsKey("header")); - Assert.assertFalse(headers.containsKey("HEADER")); - Assert.assertEquals("value", headers.get("header")); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetMetrics() { - try { - JsonObject metrics = Utils.getMetrics(); - Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_NAME_VERSION)); - Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_CLIENT_DEVICE_MODEL)); - Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS)); - Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_RUNTIME_DETAILS)); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGetMetricsWithException() { - try { - // Clearing System Properties explicitly to throw exception - System.clearProperty("os.name"); - System.clearProperty("os.version"); - System.clearProperty("java.version"); - - JsonObject metrics = Utils.getMetrics(); - Assert.assertEquals("skyflow-java@" + Constants.SDK_VERSION, metrics.get(Constants.SDK_METRIC_NAME_VERSION).getAsString()); - Assert.assertEquals("Java@", metrics.get(Constants.SDK_METRIC_RUNTIME_DETAILS).getAsString()); - Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_DEVICE_MODEL).getAsString().isEmpty()); - Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS).getAsString().isEmpty()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } -} diff --git a/v2/pom.xml b/v2/pom.xml new file mode 100644 index 00000000..9207abe0 --- /dev/null +++ b/v2/pom.xml @@ -0,0 +1,109 @@ + + + 4.0.0 + + com.skyflow + skyflow + 1.0.0 + ../pom.xml + + + skyflow-java + 2.1.1 + com.skyflow + + + false + 8 + 8 + UTF-8 + ${project.version} + + + + + com.skyflow + common + 1.0.0 + + + + + + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.6.0 + + + package + + shade + + + + + com.skyflow:common + + + + + + + + + + + jfrog + + + central + prekarilabs.jfrog.io-releases + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + snapshots + prekarilabs.jfrog.io-snapshots + https://prekarilabs.jfrog.io/artifactory/skyflow-java + + + + + maven-central + + + central + https://central.sonatype.com/api/v1/publisher/upload + + + central-snapshots + https://central.sonatype.com/api/v1/publisher/upload + + + + + + org.sonatype.central + central-publishing-maven-plugin + 0.4.0 + true + + central + true + true + + + + + + + diff --git a/src/main/java/com/skyflow/ConnectionClient.java b/v2/src/main/java/com/skyflow/ConnectionClient.java similarity index 100% rename from src/main/java/com/skyflow/ConnectionClient.java rename to v2/src/main/java/com/skyflow/ConnectionClient.java diff --git a/v2/src/main/java/com/skyflow/Skyflow.java b/v2/src/main/java/com/skyflow/Skyflow.java new file mode 100644 index 00000000..66640f0e --- /dev/null +++ b/v2/src/main/java/com/skyflow/Skyflow.java @@ -0,0 +1,227 @@ +package com.skyflow; + +import com.skyflow.config.ConnectionConfig; +import com.skyflow.config.Credentials; +import com.skyflow.config.VaultConfig; +import com.skyflow.enums.LogLevel; +import com.skyflow.errors.ErrorCode; +import com.skyflow.errors.ErrorMessage; +import com.skyflow.errors.SkyflowException; +import com.skyflow.logs.ErrorLogs; +import com.skyflow.logs.InfoLogs; +import com.skyflow.utils.Utils; +import com.skyflow.utils.logger.LogUtil; +import com.skyflow.utils.validations.Validations; +import com.skyflow.vault.controller.ConnectionController; +import com.skyflow.vault.controller.DetectController; +import com.skyflow.vault.controller.VaultController; + +import java.util.LinkedHashMap; + +public final class Skyflow extends BaseSkyflow { + private final SkyflowClientBuilder builder; + + private Skyflow(SkyflowClientBuilder builder) { + super(builder); + this.builder = builder; + } + + @Override + protected Skyflow self() { + return this; + } + + public static SkyflowClientBuilder builder() { + return new SkyflowClientBuilder(); + } + + public Skyflow addConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { + this.builder.addConnectionConfig(connectionConfig); + return this; + } + + public ConnectionConfig getConnectionConfig(String connectionId) { + return this.builder.connectionConfigMap.get(connectionId); + } + + public Skyflow updateConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { + this.builder.updateConnectionConfig(connectionConfig); + return this; + } + + public Skyflow removeConnectionConfig(String connectionId) throws SkyflowException { + this.builder.removeConnectionConfig(connectionId); + return this; + } + + /** @deprecated Use {@link #setLogLevel(LogLevel)} instead. */ + @Deprecated(since = "2.1", forRemoval = true) + public Skyflow updateLogLevel(LogLevel logLevel) { + LogUtil.printWarningLog(InfoLogs.DEPRECATED_UPDATE_LOG_LEVEL.getLog()); + return setLogLevel(logLevel); + } + + public VaultController vault() throws SkyflowException { + return resolveOrThrow(this.builder.vaultClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + public VaultController vault(String vaultId) throws SkyflowException { + return resolveOrThrow(this.builder.vaultClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + public ConnectionController connection() throws SkyflowException { + return resolveOrThrow(this.builder.connectionsMap, null, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, ErrorMessage.ConnectionIdNotInConfigList); + } + + public ConnectionController connection(String connectionId) throws SkyflowException { + return resolveOrThrow(this.builder.connectionsMap, connectionId, ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST, ErrorMessage.ConnectionIdNotInConfigList); + } + + public DetectController detect() throws SkyflowException { + return resolveOrThrow(this.builder.detectClientsMap, null, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + public DetectController detect(String vaultId) throws SkyflowException { + return resolveOrThrow(this.builder.detectClientsMap, vaultId, ErrorLogs.VAULT_CONFIG_DOES_NOT_EXIST, ErrorMessage.VaultIdNotInConfigList); + } + + public static final class SkyflowClientBuilder extends BaseSkyflowClientBuilder { + private final LinkedHashMap vaultClientsMap = new LinkedHashMap<>(); + private final LinkedHashMap connectionsMap = new LinkedHashMap<>(); + private final LinkedHashMap detectClientsMap = new LinkedHashMap<>(); + private final LinkedHashMap connectionConfigMap = new LinkedHashMap<>(); + + @Override + protected void validateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + Validations.validateVaultConfig(vaultConfig); + } + + @Override + protected void onVaultConfigAdded(VaultConfig vaultConfig) throws SkyflowException { + this.vaultClientsMap.put(vaultConfig.getVaultId(), new VaultController(vaultConfig, this.skyflowCredentials)); + this.detectClientsMap.put(vaultConfig.getVaultId(), new DetectController(vaultConfig, this.skyflowCredentials)); + LogUtil.printInfoLog(Utils.parameterizedString(InfoLogs.VAULT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); + LogUtil.printInfoLog(Utils.parameterizedString(InfoLogs.DETECT_CONTROLLER_INITIALIZED.getLog(), vaultConfig.getVaultId())); + } + + @Override + protected void onVaultConfigUpdated(VaultConfig updatedConfig) throws SkyflowException { + this.vaultClientsMap.get(updatedConfig.getVaultId()).updateVaultConfig(updatedConfig); + } + + @Override + protected void onVaultConfigRemoved(String vaultId) throws SkyflowException { + this.vaultClientsMap.remove(vaultId); + } + + @Override + protected boolean hasVaultClient(String vaultId) { + return this.vaultClientsMap.containsKey(vaultId); + } + + @Override + protected void onCredentialsUpdated(Credentials credentials) throws SkyflowException { + for (VaultController vault : this.vaultClientsMap.values()) { + vault.setCommonCredentials(credentials); + } + for (DetectController detect : this.detectClientsMap.values()) { + detect.setCommonCredentials(credentials); + } + for (ConnectionController connection : this.connectionsMap.values()) { + connection.setCommonCredentials(credentials); + } + } + + public SkyflowClientBuilder addConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.VALIDATING_CONNECTION_CONFIG.getLog()); + Validations.validateConnectionConfig(connectionConfig); + if (this.connectionsMap.containsKey(connectionConfig.getConnectionId())) { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.CONNECTION_CONFIG_EXISTS.getLog(), connectionConfig.getConnectionId() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + ErrorMessage.ConnectionIdAlreadyInConfigList.getMessage()); + } else { + this.connectionConfigMap.put(connectionConfig.getConnectionId(), connectionConfig); + ConnectionController controller = new ConnectionController(connectionConfig, this.skyflowCredentials); + this.connectionsMap.put(connectionConfig.getConnectionId(), controller); + LogUtil.printInfoLog(Utils.parameterizedString( + InfoLogs.CONNECTION_CONTROLLER_INITIALIZED.getLog(), connectionConfig.getConnectionId())); + } + return this; + } + + public SkyflowClientBuilder updateConnectionConfig(ConnectionConfig connectionConfig) throws SkyflowException { + LogUtil.printInfoLog(InfoLogs.VALIDATING_CONNECTION_CONFIG.getLog()); + Validations.validateConnectionConfig(connectionConfig); + if (this.connectionsMap.containsKey(connectionConfig.getConnectionId())) { + ConnectionConfig updatedConfig = findAndUpdateConnectionConfig(connectionConfig); + this.connectionsMap.get(updatedConfig.getConnectionId()).updateConnectionConfig(connectionConfig); + } else { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog(), connectionConfig.getConnectionId() + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + ErrorMessage.ConnectionIdNotInConfigList.getMessage()); + } + return this; + } + + public SkyflowClientBuilder removeConnectionConfig(String connectionId) throws SkyflowException { + if (this.connectionsMap.containsKey(connectionId)) { + this.connectionsMap.remove(connectionId); + this.connectionConfigMap.remove(connectionId); + } else { + LogUtil.printErrorLog(Utils.parameterizedString( + ErrorLogs.CONNECTION_CONFIG_DOES_NOT_EXIST.getLog(), connectionId + )); + throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), + ErrorMessage.ConnectionIdNotInConfigList.getMessage()); + } + return this; + } + + @Override + public SkyflowClientBuilder addVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + super.addVaultConfig(vaultConfig); + return this; + } + + @Override + public SkyflowClientBuilder updateVaultConfig(VaultConfig vaultConfig) throws SkyflowException { + super.updateVaultConfig(vaultConfig); + return this; + } + + @Override + public SkyflowClientBuilder removeVaultConfig(String vaultId) throws SkyflowException { + super.removeVaultConfig(vaultId); + return this; + } + + @Override + public SkyflowClientBuilder addSkyflowCredentials(Credentials credentials) throws SkyflowException { + super.addSkyflowCredentials(credentials); + return this; + } + + @Override + public SkyflowClientBuilder setLogLevel(LogLevel logLevel) { + super.setLogLevel(logLevel); + return this; + } + + public Skyflow build() { + return new Skyflow(this); + } + + private ConnectionConfig findAndUpdateConnectionConfig(ConnectionConfig connectionConfig) { + ConnectionConfig previousConfig = this.connectionConfigMap.get(connectionConfig.getConnectionId()); + String connectionURL = connectionConfig.getConnectionUrl() != null ? connectionConfig.getConnectionUrl() : previousConfig.getConnectionUrl(); + Credentials credentials = connectionConfig.getCredentials() != null ? connectionConfig.getCredentials() : previousConfig.getCredentials(); + previousConfig.setConnectionUrl(connectionURL); + previousConfig.setCredentials(credentials); + return previousConfig; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/skyflow/VaultClient.java b/v2/src/main/java/com/skyflow/VaultClient.java similarity index 91% rename from src/main/java/com/skyflow/VaultClient.java rename to v2/src/main/java/com/skyflow/VaultClient.java index 1d5e5d74..84289e8f 100644 --- a/src/main/java/com/skyflow/VaultClient.java +++ b/v2/src/main/java/com/skyflow/VaultClient.java @@ -26,12 +26,7 @@ import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.Transformations; import com.skyflow.generated.rest.types.*; -import com.skyflow.logs.InfoLogs; -import com.skyflow.serviceaccount.util.Token; -import com.skyflow.utils.Constants; import com.skyflow.utils.Utils; -import com.skyflow.utils.logger.LogUtil; -import com.skyflow.utils.validations.Validations; import com.skyflow.vault.data.FileUploadRequest; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; @@ -41,35 +36,20 @@ import com.skyflow.vault.tokens.DetokenizeData; import com.skyflow.vault.tokens.DetokenizeRequest; import com.skyflow.vault.tokens.TokenizeRequest; -import io.github.cdimascio.dotenv.Dotenv; -import io.github.cdimascio.dotenv.DotenvException; -import okhttp3.ConnectionPool; -import okhttp3.OkHttpClient; -import okhttp3.Request; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.*; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; -public class VaultClient { - private final VaultConfig vaultConfig; +public class VaultClient extends BaseVaultClient { private final ApiClientBuilder apiClientBuilder; private ApiClient apiClient; - private OkHttpClient sharedHttpClient; - private String currentVaultURL; - private Credentials commonCredentials; - private Credentials finalCredentials; - private String token; - private String apiKey; protected VaultClient(VaultConfig vaultConfig, Credentials credentials) { - super(); - this.vaultConfig = vaultConfig; - this.commonCredentials = credentials; + super(vaultConfig, credentials); this.apiClientBuilder = new ApiClientBuilder(); this.apiClient = null; updateVaultURL(); @@ -95,18 +75,19 @@ protected QueryClient getQueryApi() { return this.apiClient.query(); } - protected VaultConfig getVaultConfig() { - return vaultConfig; - } - protected void setCommonCredentials(Credentials commonCredentials) throws SkyflowException { this.commonCredentials = commonCredentials; - prioritiseCredentials(); + super.prioritiseCredentials(this.vaultConfig.getCredentials()); } protected void updateVaultConfig() throws SkyflowException { updateVaultURL(); - prioritiseCredentials(); + super.prioritiseCredentials(this.vaultConfig.getCredentials()); + } + + protected void updateVaultConfig(VaultConfig newConfig) throws SkyflowException { + this.vaultConfig = newConfig; + updateVaultConfig(); } protected V1DetokenizePayload getDetokenizePayload(DetokenizeRequest request) { @@ -233,19 +214,7 @@ protected File getFileForFileUpload(FileUploadRequest fileUploadRequest) throws } protected void setBearerToken() throws SkyflowException { - prioritiseCredentials(); - Validations.validateCredentials(this.finalCredentials); - if (this.finalCredentials.getApiKey() != null) { - LogUtil.printInfoLog(InfoLogs.REUSE_API_KEY.getLog()); - token = this.finalCredentials.getApiKey(); - } else if (token == null || token.trim().isEmpty()) { - token = Utils.generateBearerToken(this.finalCredentials); - } else if (Token.isExpired(token)) { - LogUtil.printInfoLog(InfoLogs.BEARER_TOKEN_EXPIRED.getLog()); - token = Utils.generateBearerToken(this.finalCredentials); - } else { - LogUtil.printInfoLog(InfoLogs.REUSE_BEARER_TOKEN.getLog()); - } + super.setBearerToken(this.vaultConfig.getCredentials()); if (apiClient == null) { updateExecutorInHTTP(); this.apiClient = this.apiClientBuilder.build(); @@ -838,48 +807,9 @@ private void updateVaultURL() { private void updateExecutorInHTTP() { if (sharedHttpClient == null) { - sharedHttpClient = new OkHttpClient.Builder() - .connectionPool(new ConnectionPool(10, 1, TimeUnit.MINUTES)) - .addInterceptor(chain -> { - Request requestWithAuth = chain.request().newBuilder() - .header("Authorization", "Bearer " + this.token) - .build(); - return chain.proceed(requestWithAuth); - }) - .build(); + sharedHttpClient = buildSharedHttpClient(() -> this.token); apiClientBuilder.httpClient(sharedHttpClient); } } - private void prioritiseCredentials() throws SkyflowException { - try { - Credentials original = this.finalCredentials; - if (this.vaultConfig.getCredentials() != null) { - this.finalCredentials = this.vaultConfig.getCredentials(); - } else if (this.commonCredentials != null) { - this.finalCredentials = this.commonCredentials; - } else { - Dotenv dotenv = Dotenv.load(); - String sysCredentials = dotenv.get(Constants.ENV_CREDENTIALS_KEY_NAME); - if (sysCredentials == null) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.EmptyCredentials.getMessage()); - } else { - this.finalCredentials = new Credentials(); - this.finalCredentials.setCredentialsString(sysCredentials); - } - } - if (original != null && !original.equals(this.finalCredentials)) { - token = null; - apiKey = null; - } - } catch (DotenvException e) { - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - ErrorMessage.EmptyCredentials.getMessage()); - } catch (SkyflowException e) { - throw e; - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} +} \ No newline at end of file diff --git a/src/main/java/com/skyflow/config/ConnectionConfig.java b/v2/src/main/java/com/skyflow/config/ConnectionConfig.java similarity index 100% rename from src/main/java/com/skyflow/config/ConnectionConfig.java rename to v2/src/main/java/com/skyflow/config/ConnectionConfig.java diff --git a/src/main/java/com/skyflow/config/ManagementConfig.java b/v2/src/main/java/com/skyflow/config/ManagementConfig.java similarity index 100% rename from src/main/java/com/skyflow/config/ManagementConfig.java rename to v2/src/main/java/com/skyflow/config/ManagementConfig.java diff --git a/v2/src/main/java/com/skyflow/config/VaultConfig.java b/v2/src/main/java/com/skyflow/config/VaultConfig.java new file mode 100644 index 00000000..2abd6a27 --- /dev/null +++ b/v2/src/main/java/com/skyflow/config/VaultConfig.java @@ -0,0 +1,9 @@ +package com.skyflow.config; + +public class VaultConfig extends BaseVaultConfig { + + public VaultConfig() { + super(); + } + +} diff --git a/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java b/v2/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java similarity index 100% rename from src/main/java/com/skyflow/enums/DeidentifyFileStatus.java rename to v2/src/main/java/com/skyflow/enums/DeidentifyFileStatus.java diff --git a/src/main/java/com/skyflow/enums/DetectEntities.java b/v2/src/main/java/com/skyflow/enums/DetectEntities.java similarity index 100% rename from src/main/java/com/skyflow/enums/DetectEntities.java rename to v2/src/main/java/com/skyflow/enums/DetectEntities.java diff --git a/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java b/v2/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java similarity index 100% rename from src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java rename to v2/src/main/java/com/skyflow/enums/DetectOutputTranscriptions.java diff --git a/v2/src/main/java/com/skyflow/enums/Env.java b/v2/src/main/java/com/skyflow/enums/Env.java new file mode 100644 index 00000000..3d1466e9 --- /dev/null +++ b/v2/src/main/java/com/skyflow/enums/Env.java @@ -0,0 +1,8 @@ +package com.skyflow.enums; + +public enum Env { + DEV, + STAGE, + SANDBOX, + PROD +} diff --git a/src/main/java/com/skyflow/enums/InterfaceName.java b/v2/src/main/java/com/skyflow/enums/InterfaceName.java similarity index 100% rename from src/main/java/com/skyflow/enums/InterfaceName.java rename to v2/src/main/java/com/skyflow/enums/InterfaceName.java diff --git a/v2/src/main/java/com/skyflow/enums/LogLevel.java b/v2/src/main/java/com/skyflow/enums/LogLevel.java new file mode 100644 index 00000000..a605b520 --- /dev/null +++ b/v2/src/main/java/com/skyflow/enums/LogLevel.java @@ -0,0 +1,9 @@ +package com.skyflow.enums; + +public enum LogLevel { + OFF, + ERROR, + WARN, + INFO, + DEBUG +} diff --git a/src/main/java/com/skyflow/enums/MaskingMethod.java b/v2/src/main/java/com/skyflow/enums/MaskingMethod.java similarity index 100% rename from src/main/java/com/skyflow/enums/MaskingMethod.java rename to v2/src/main/java/com/skyflow/enums/MaskingMethod.java diff --git a/src/main/java/com/skyflow/enums/RedactionType.java b/v2/src/main/java/com/skyflow/enums/RedactionType.java similarity index 100% rename from src/main/java/com/skyflow/enums/RedactionType.java rename to v2/src/main/java/com/skyflow/enums/RedactionType.java diff --git a/src/main/java/com/skyflow/enums/RequestMethod.java b/v2/src/main/java/com/skyflow/enums/RequestMethod.java similarity index 100% rename from src/main/java/com/skyflow/enums/RequestMethod.java rename to v2/src/main/java/com/skyflow/enums/RequestMethod.java diff --git a/src/main/java/com/skyflow/enums/TokenMode.java b/v2/src/main/java/com/skyflow/enums/TokenMode.java similarity index 100% rename from src/main/java/com/skyflow/enums/TokenMode.java rename to v2/src/main/java/com/skyflow/enums/TokenMode.java diff --git a/src/main/java/com/skyflow/enums/TokenType.java b/v2/src/main/java/com/skyflow/enums/TokenType.java similarity index 100% rename from src/main/java/com/skyflow/enums/TokenType.java rename to v2/src/main/java/com/skyflow/enums/TokenType.java diff --git a/src/main/java/com/skyflow/errors/ErrorMessage.java b/v2/src/main/java/com/skyflow/errors/ErrorMessage.java similarity index 100% rename from src/main/java/com/skyflow/errors/ErrorMessage.java rename to v2/src/main/java/com/skyflow/errors/ErrorMessage.java diff --git a/src/main/java/com/skyflow/errors/SkyflowException.java b/v2/src/main/java/com/skyflow/errors/SkyflowException.java similarity index 100% rename from src/main/java/com/skyflow/errors/SkyflowException.java rename to v2/src/main/java/com/skyflow/errors/SkyflowException.java diff --git a/src/main/java/com/skyflow/generated/rest/ApiClient.java b/v2/src/main/java/com/skyflow/generated/rest/ApiClient.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/ApiClient.java rename to v2/src/main/java/com/skyflow/generated/rest/ApiClient.java index 1eb1e429..ab81f443 100644 --- a/src/main/java/com/skyflow/generated/rest/ApiClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/ApiClient.java @@ -6,7 +6,6 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Suppliers; import com.skyflow.generated.rest.resources.audit.AuditClient; -import com.skyflow.generated.rest.resources.authentication.AuthenticationClient; import com.skyflow.generated.rest.resources.binlookup.BinLookupClient; import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.resources.guardrails.GuardrailsClient; @@ -14,6 +13,7 @@ import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.strings.StringsClient; import com.skyflow.generated.rest.resources.tokens.TokensClient; + import java.util.function.Supplier; public class ApiClient { @@ -29,8 +29,6 @@ public class ApiClient { protected final Supplier queryClient; - protected final Supplier authenticationClient; - protected final Supplier filesClient; protected final Supplier stringsClient; @@ -44,7 +42,6 @@ public ApiClient(ClientOptions clientOptions) { this.recordsClient = Suppliers.memoize(() -> new RecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new TokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new QueryClient(clientOptions)); - this.authenticationClient = Suppliers.memoize(() -> new AuthenticationClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new FilesClient(clientOptions)); this.stringsClient = Suppliers.memoize(() -> new StringsClient(clientOptions)); this.guardrailsClient = Suppliers.memoize(() -> new GuardrailsClient(clientOptions)); @@ -70,10 +67,6 @@ public QueryClient query() { return this.queryClient.get(); } - public AuthenticationClient authentication() { - return this.authenticationClient.get(); - } - public FilesClient files() { return this.filesClient.get(); } diff --git a/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java b/v2/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java rename to v2/src/main/java/com/skyflow/generated/rest/ApiClientBuilder.java diff --git a/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java b/v2/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/AsyncApiClient.java rename to v2/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java index 405d0208..dc57df06 100644 --- a/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/AsyncApiClient.java @@ -6,7 +6,6 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.Suppliers; import com.skyflow.generated.rest.resources.audit.AsyncAuditClient; -import com.skyflow.generated.rest.resources.authentication.AsyncAuthenticationClient; import com.skyflow.generated.rest.resources.binlookup.AsyncBinLookupClient; import com.skyflow.generated.rest.resources.files.AsyncFilesClient; import com.skyflow.generated.rest.resources.guardrails.AsyncGuardrailsClient; @@ -14,6 +13,7 @@ import com.skyflow.generated.rest.resources.records.AsyncRecordsClient; import com.skyflow.generated.rest.resources.strings.AsyncStringsClient; import com.skyflow.generated.rest.resources.tokens.AsyncTokensClient; + import java.util.function.Supplier; public class AsyncApiClient { @@ -29,8 +29,6 @@ public class AsyncApiClient { protected final Supplier queryClient; - protected final Supplier authenticationClient; - protected final Supplier filesClient; protected final Supplier stringsClient; @@ -44,7 +42,6 @@ public AsyncApiClient(ClientOptions clientOptions) { this.recordsClient = Suppliers.memoize(() -> new AsyncRecordsClient(clientOptions)); this.tokensClient = Suppliers.memoize(() -> new AsyncTokensClient(clientOptions)); this.queryClient = Suppliers.memoize(() -> new AsyncQueryClient(clientOptions)); - this.authenticationClient = Suppliers.memoize(() -> new AsyncAuthenticationClient(clientOptions)); this.filesClient = Suppliers.memoize(() -> new AsyncFilesClient(clientOptions)); this.stringsClient = Suppliers.memoize(() -> new AsyncStringsClient(clientOptions)); this.guardrailsClient = Suppliers.memoize(() -> new AsyncGuardrailsClient(clientOptions)); @@ -70,10 +67,6 @@ public AsyncQueryClient query() { return this.queryClient.get(); } - public AsyncAuthenticationClient authentication() { - return this.authenticationClient.get(); - } - public AsyncFilesClient files() { return this.filesClient.get(); } diff --git a/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java b/v2/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java rename to v2/src/main/java/com/skyflow/generated/rest/AsyncApiClientBuilder.java diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java new file mode 100644 index 00000000..be5247eb --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientApiException.java @@ -0,0 +1,74 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.Response; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * This exception type will be thrown for any non-2XX API responses. + */ +public class ApiClientApiException extends ApiClientException { + /** + * The error code of the response that triggered the exception. + */ + private final int statusCode; + + /** + * The body of the response that triggered the exception. + */ + private final Object body; + + private final Map> headers; + + public ApiClientApiException(String message, int statusCode, Object body) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + } + + public ApiClientApiException(String message, int statusCode, Object body, Response rawResponse) { + super(message); + this.statusCode = statusCode; + this.body = body; + this.headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + this.headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + } + + /** + * @return the statusCode + */ + public int statusCode() { + return this.statusCode; + } + + /** + * @return the body + */ + public Object body() { + return this.body; + } + + /** + * @return the headers + */ + public Map> headers() { + return this.headers; + } + + @Override + public String toString() { + return "ApiClientApiException{" + "message: " + getMessage() + ", statusCode: " + statusCode + ", body: " + body + + "}"; + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java new file mode 100644 index 00000000..7987eba6 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientException.java @@ -0,0 +1,17 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +/** + * This class serves as the base exception for all errors in the SDK. + */ +public class ApiClientException extends RuntimeException { + public ApiClientException(String message) { + super(message); + } + + public ApiClientException(String message, Exception e) { + super(message, e); + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java new file mode 100644 index 00000000..c743352c --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ApiClientHttpResponse.java @@ -0,0 +1,38 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.Response; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public final class ApiClientHttpResponse { + + private final T body; + + private final Map> headers; + + public ApiClientHttpResponse(T body, Response rawResponse) { + this.body = body; + + Map> headers = new HashMap<>(); + rawResponse.headers().forEach(header -> { + String key = header.component1(); + String value = header.component2(); + headers.computeIfAbsent(key, _str -> new ArrayList<>()).add(value); + }); + this.headers = headers; + } + + public T body() { + return this.body; + } + + public Map> headers() { + return headers; + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java b/v2/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/core/ClientOptions.java rename to v2/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java index ddb0e107..da41fb25 100644 --- a/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ClientOptions.java @@ -3,12 +3,13 @@ */ package com.skyflow.generated.rest.core; +import okhttp3.OkHttpClient; + import java.util.HashMap; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; -import okhttp3.OkHttpClient; public final class ClientOptions { private final Environment environment; diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java b/v2/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java new file mode 100644 index 00000000..a0a6d7c4 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/DateTimeDeserializer.java @@ -0,0 +1,56 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; +import com.fasterxml.jackson.databind.module.SimpleModule; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneOffset; +import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalAccessor; +import java.time.temporal.TemporalQueries; + +/** + * Custom deserializer that handles converting ISO8601 dates into {@link OffsetDateTime} objects. + */ +class DateTimeDeserializer extends JsonDeserializer { + private static final SimpleModule MODULE; + + static { + MODULE = new SimpleModule().addDeserializer(OffsetDateTime.class, new DateTimeDeserializer()); + } + + /** + * Gets a module wrapping this deserializer as an adapter for the Jackson ObjectMapper. + * + * @return A {@link SimpleModule} to be plugged onto Jackson ObjectMapper. + */ + public static SimpleModule getModule() { + return MODULE; + } + + @Override + public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { + JsonToken token = parser.currentToken(); + if (token == JsonToken.VALUE_NUMBER_INT) { + return OffsetDateTime.ofInstant(Instant.ofEpochSecond(parser.getValueAsLong()), ZoneOffset.UTC); + } else { + TemporalAccessor temporal = DateTimeFormatter.ISO_DATE_TIME.parseBest( + parser.getValueAsString(), OffsetDateTime::from, LocalDateTime::from); + + if (temporal.query(TemporalQueries.offset()) == null) { + return LocalDateTime.from(temporal).atOffset(ZoneOffset.UTC); + } else { + return OffsetDateTime.from(temporal); + } + } + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/Environment.java b/v2/src/main/java/com/skyflow/generated/rest/core/Environment.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/Environment.java rename to v2/src/main/java/com/skyflow/generated/rest/core/Environment.java diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/FileStream.java b/v2/src/main/java/com/skyflow/generated/rest/core/FileStream.java new file mode 100644 index 00000000..2131b0a4 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/FileStream.java @@ -0,0 +1,61 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import org.jetbrains.annotations.Nullable; + +import java.io.InputStream; +import java.util.Objects; + +/** + * Represents a file stream with associated metadata for file uploads. + */ +public class FileStream { + private final InputStream inputStream; + private final String fileName; + private final MediaType contentType; + + /** + * Constructs a FileStream with the given input stream and optional metadata. + * + * @param inputStream The input stream of the file content. Must not be null. + * @param fileName The name of the file, or null if unknown. + * @param contentType The MIME type of the file content, or null if unknown. + * @throws NullPointerException if inputStream is null + */ + public FileStream(InputStream inputStream, @Nullable String fileName, @Nullable MediaType contentType) { + this.inputStream = Objects.requireNonNull(inputStream, "Input stream cannot be null"); + this.fileName = fileName; + this.contentType = contentType; + } + + public FileStream(InputStream inputStream) { + this(inputStream, null, null); + } + + public InputStream getInputStream() { + return inputStream; + } + + @Nullable + public String getFileName() { + return fileName; + } + + @Nullable + public MediaType getContentType() { + return contentType; + } + + /** + * Creates a RequestBody suitable for use with OkHttp client. + * + * @return A RequestBody instance representing this file stream. + */ + public RequestBody toRequestBody() { + return new InputStreamRequestBody(contentType, inputStream); + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java b/v2/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java new file mode 100644 index 00000000..55c3c971 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/InputStreamRequestBody.java @@ -0,0 +1,80 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.internal.Util; +import okio.BufferedSink; +import okio.Okio; +import okio.Source; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Objects; + +/** + * A custom implementation of OkHttp's RequestBody that wraps an InputStream. + * This class allows streaming of data from an InputStream directly to an HTTP request body, + * which is useful for file uploads or sending large amounts of data without loading it all into memory. + */ +public class InputStreamRequestBody extends RequestBody { + private final InputStream inputStream; + private final MediaType contentType; + + /** + * Constructs an InputStreamRequestBody with the specified content type and input stream. + * + * @param contentType the MediaType of the content, or null if not known + * @param inputStream the InputStream containing the data to be sent + * @throws NullPointerException if inputStream is null + */ + public InputStreamRequestBody(@Nullable MediaType contentType, InputStream inputStream) { + this.contentType = contentType; + this.inputStream = Objects.requireNonNull(inputStream, "inputStream == null"); + } + + /** + * Returns the content type of this request body. + * + * @return the MediaType of the content, or null if not specified + */ + @Nullable + @Override + public MediaType contentType() { + return contentType; + } + + /** + * Returns the content length of this request body, if known. + * This method attempts to determine the length using the InputStream's available() method, + * which may not always accurately reflect the total length of the stream. + * + * @return the content length, or -1 if the length is unknown + * @throws IOException if an I/O error occurs + */ + @Override + public long contentLength() throws IOException { + return inputStream.available() == 0 ? -1 : inputStream.available(); + } + + /** + * Writes the content of the InputStream to the given BufferedSink. + * This method is responsible for transferring the data from the InputStream to the network request. + * + * @param sink the BufferedSink to write the content to + * @throws IOException if an I/O error occurs during writing + */ + @Override + public void writeTo(BufferedSink sink) throws IOException { + Source source = null; + try { + source = Okio.source(inputStream); + sink.writeAll(source); + } finally { + Util.closeQuietly(Objects.requireNonNull(source)); + } + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java b/v2/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java new file mode 100644 index 00000000..11714cb8 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/MediaTypes.java @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.MediaType; + +public final class MediaTypes { + + public static final MediaType APPLICATION_JSON = MediaType.parse("application/json"); + + private MediaTypes() {} +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/Nullable.java b/v2/src/main/java/com/skyflow/generated/rest/core/Nullable.java new file mode 100644 index 00000000..5929c12d --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/Nullable.java @@ -0,0 +1,140 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.Optional; +import java.util.function.Function; + +public final class Nullable { + + private final Either, Null> value; + + private Nullable() { + this.value = Either.left(Optional.empty()); + } + + private Nullable(T value) { + if (value == null) { + this.value = Either.right(Null.INSTANCE); + } else { + this.value = Either.left(Optional.of(value)); + } + } + + public static Nullable ofNull() { + return new Nullable<>(null); + } + + public static Nullable of(T value) { + return new Nullable<>(value); + } + + public static Nullable empty() { + return new Nullable<>(); + } + + public static Nullable ofOptional(Optional value) { + if (value.isPresent()) { + return of(value.get()); + } else { + return empty(); + } + } + + public boolean isNull() { + return this.value.isRight(); + } + + public boolean isEmpty() { + return this.value.isLeft() && !this.value.getLeft().isPresent(); + } + + public T get() { + if (this.isNull()) { + return null; + } + + return this.value.getLeft().get(); + } + + public Nullable map(Function mapper) { + if (this.isNull()) { + return Nullable.ofNull(); + } + + return Nullable.ofOptional(this.value.getLeft().map(mapper)); + } + + @Override + public boolean equals(Object other) { + if (!(other instanceof Nullable)) { + return false; + } + + if (((Nullable) other).isNull() && this.isNull()) { + return true; + } + + return this.value.getLeft().equals(((Nullable) other).value.getLeft()); + } + + private static final class Either { + private L left = null; + private R right = null; + + private Either(L left, R right) { + if (left != null && right != null) { + throw new IllegalArgumentException("Left and right argument cannot both be non-null."); + } + + if (left == null && right == null) { + throw new IllegalArgumentException("Left and right argument cannot both be null."); + } + + if (left != null) { + this.left = left; + } + + if (right != null) { + this.right = right; + } + } + + public static Either left(L left) { + return new Either<>(left, null); + } + + public static Either right(R right) { + return new Either<>(null, right); + } + + public boolean isLeft() { + return this.left != null; + } + + public boolean isRight() { + return this.right != null; + } + + public L getLeft() { + if (!this.isLeft()) { + throw new IllegalArgumentException("Cannot get left from right Either."); + } + return this.left; + } + + public R getRight() { + if (!this.isRight()) { + throw new IllegalArgumentException("Cannot get right from left Either."); + } + return this.right; + } + } + + private static final class Null { + private static final Null INSTANCE = new Null(); + + private Null() {} + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java b/v2/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java new file mode 100644 index 00000000..98c33be4 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/NullableNonemptyFilter.java @@ -0,0 +1,19 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.Optional; + +public final class NullableNonemptyFilter { + @Override + public boolean equals(Object o) { + boolean isOptionalEmpty = isOptionalEmpty(o); + + return isOptionalEmpty; + } + + private boolean isOptionalEmpty(Object o) { + return o instanceof Optional && !((Optional) o).isPresent(); + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java b/v2/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java new file mode 100644 index 00000000..acec32b4 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ObjectMappers.java @@ -0,0 +1,37 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; + +import java.io.IOException; + +public final class ObjectMappers { + public static final ObjectMapper JSON_MAPPER = JsonMapper.builder() + .addModule(new Jdk8Module()) + .addModule(new JavaTimeModule()) + .addModule(DateTimeDeserializer.getModule()) + .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES) + .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .build(); + + private ObjectMappers() {} + + public static String stringify(Object o) { + try { + return JSON_MAPPER + .setSerializationInclusion(JsonInclude.Include.ALWAYS) + .writerWithDefaultPrettyPrinter() + .writeValueAsString(o); + } catch (IOException e) { + return o.getClass().getName() + "@" + Integer.toHexString(o.hashCode()); + } + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java b/v2/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java new file mode 100644 index 00000000..c0687736 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/QueryStringMapper.java @@ -0,0 +1,139 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import okhttp3.HttpUrl; +import okhttp3.MultipartBody; + +import java.util.*; + +public class QueryStringMapper { + + private static final ObjectMapper MAPPER = ObjectMappers.JSON_MAPPER; + + public static void addQueryParameter(HttpUrl.Builder httpUrl, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + httpUrl.addQueryParameter(key, valueNode.textValue()); + } else { + httpUrl.addQueryParameter(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().textValue()); + } else { + httpUrl.addQueryParameter(key + field.getKey(), field.getValue().toString()); + } + } + } + + public static void addFormDataPart( + MultipartBody.Builder multipartBody, String key, Object value, boolean arraysAsRepeats) { + JsonNode valueNode = MAPPER.valueToTree(value); + + List> flat; + if (valueNode.isObject()) { + flat = flattenObject((ObjectNode) valueNode, arraysAsRepeats); + } else if (valueNode.isArray()) { + flat = flattenArray((ArrayNode) valueNode, "", arraysAsRepeats); + } else { + if (valueNode.isTextual()) { + multipartBody.addFormDataPart(key, valueNode.textValue()); + } else { + multipartBody.addFormDataPart(key, valueNode.toString()); + } + return; + } + + for (Map.Entry field : flat) { + if (field.getValue().isTextual()) { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().textValue()); + } else { + multipartBody.addFormDataPart( + key + field.getKey(), field.getValue().toString()); + } + } + } + + public static List> flattenObject(ObjectNode object, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator> fields = object.fields(); + while (fields.hasNext()) { + Map.Entry field = fields.next(); + + String key = "[" + field.getKey() + "]"; + + if (field.getValue().isObject()) { + List> flatField = + flattenObject((ObjectNode) field.getValue(), arraysAsRepeats); + addAll(flat, flatField, key); + } else if (field.getValue().isArray()) { + List> flatField = + flattenArray((ArrayNode) field.getValue(), key, arraysAsRepeats); + addAll(flat, flatField, ""); + } else { + flat.add(new AbstractMap.SimpleEntry<>(key, field.getValue())); + } + } + + return flat; + } + + private static List> flattenArray( + ArrayNode array, String key, boolean arraysAsRepeats) { + List> flat = new ArrayList<>(); + + Iterator elements = array.elements(); + + int index = 0; + while (elements.hasNext()) { + JsonNode element = elements.next(); + + String indexKey = key + "[" + index + "]"; + + if (arraysAsRepeats) { + indexKey = key; + } + + if (element.isObject()) { + List> flatField = flattenObject((ObjectNode) element, arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else if (element.isArray()) { + List> flatField = flattenArray((ArrayNode) element, "", arraysAsRepeats); + addAll(flat, flatField, indexKey); + } else { + flat.add(new AbstractMap.SimpleEntry<>(indexKey, element)); + } + + index++; + } + + return flat; + } + + private static void addAll( + List> target, List> source, String prefix) { + for (Map.Entry entry : source) { + Map.Entry entryToAdd = + new AbstractMap.SimpleEntry<>(prefix + entry.getKey(), entry.getValue()); + target.add(entryToAdd); + } + } +} diff --git a/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java b/v2/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/core/RequestOptions.java rename to v2/src/main/java/com/skyflow/generated/rest/core/RequestOptions.java diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java b/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java new file mode 100644 index 00000000..1bb0b5dc --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyInputStream.java @@ -0,0 +1,46 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.Response; + +import java.io.FilterInputStream; +import java.io.IOException; + +/** + * A custom InputStream that wraps the InputStream from the OkHttp Response and ensures that the + * OkHttp Response object is properly closed when the stream is closed. + * + * This class extends FilterInputStream and takes an OkHttp Response object as a parameter. + * It retrieves the InputStream from the Response and overrides the close method to close + * both the InputStream and the Response object, ensuring proper resource management and preventing + * premature closure of the underlying HTTP connection. + */ +public class ResponseBodyInputStream extends FilterInputStream { + private final Response response; + + /** + * Constructs a ResponseBodyInputStream that wraps the InputStream from the given OkHttp + * Response object. + * + * @param response the OkHttp Response object from which the InputStream is retrieved + * @throws IOException if an I/O error occurs while retrieving the InputStream + */ + public ResponseBodyInputStream(Response response) throws IOException { + super(response.body().byteStream()); + this.response = response; + } + + /** + * Closes the InputStream and the associated OkHttp Response object. This ensures that the + * underlying HTTP connection is properly closed after the stream is no longer needed. + * + * @throws IOException if an I/O error occurs + */ + @Override + public void close() throws IOException { + super.close(); + response.close(); // Ensure the response is closed when the stream is closed + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java b/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java new file mode 100644 index 00000000..e6c1a525 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/ResponseBodyReader.java @@ -0,0 +1,45 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.Response; + +import java.io.FilterReader; +import java.io.IOException; + +/** + * A custom Reader that wraps the Reader from the OkHttp Response and ensures that the + * OkHttp Response object is properly closed when the reader is closed. + * + * This class extends FilterReader and takes an OkHttp Response object as a parameter. + * It retrieves the Reader from the Response and overrides the close method to close + * both the Reader and the Response object, ensuring proper resource management and preventing + * premature closure of the underlying HTTP connection. + */ +public class ResponseBodyReader extends FilterReader { + private final Response response; + + /** + * Constructs a ResponseBodyReader that wraps the Reader from the given OkHttp Response object. + * + * @param response the OkHttp Response object from which the Reader is retrieved + * @throws IOException if an I/O error occurs while retrieving the Reader + */ + public ResponseBodyReader(Response response) throws IOException { + super(response.body().charStream()); + this.response = response; + } + + /** + * Closes the Reader and the associated OkHttp Response object. This ensures that the + * underlying HTTP connection is properly closed after the reader is no longer needed. + * + * @throws IOException if an I/O error occurs + */ + @Override + public void close() throws IOException { + super.close(); + response.close(); // Ensure the response is closed when the reader is closed + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java b/v2/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java new file mode 100644 index 00000000..7a28c3c9 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/RetryInterceptor.java @@ -0,0 +1,79 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import okhttp3.Interceptor; +import okhttp3.Response; + +import java.io.IOException; +import java.time.Duration; +import java.util.Optional; +import java.util.Random; + +public class RetryInterceptor implements Interceptor { + + private static final Duration ONE_SECOND = Duration.ofSeconds(1); + private final ExponentialBackoff backoff; + private final Random random = new Random(); + + public RetryInterceptor(int maxRetries) { + this.backoff = new ExponentialBackoff(maxRetries); + } + + @Override + public Response intercept(Chain chain) throws IOException { + Response response = chain.proceed(chain.request()); + + if (shouldRetry(response.code())) { + return retryChain(response, chain); + } + + return response; + } + + private Response retryChain(Response response, Chain chain) throws IOException { + Optional nextBackoff = this.backoff.nextBackoff(); + while (nextBackoff.isPresent()) { + try { + Thread.sleep(nextBackoff.get().toMillis()); + } catch (InterruptedException e) { + throw new IOException("Interrupted while trying request", e); + } + response.close(); + response = chain.proceed(chain.request()); + if (shouldRetry(response.code())) { + nextBackoff = this.backoff.nextBackoff(); + } else { + return response; + } + } + + return response; + } + + private static boolean shouldRetry(int statusCode) { + return statusCode == 408 || statusCode == 429 || statusCode >= 500; + } + + private final class ExponentialBackoff { + + private final int maxNumRetries; + + private int retryNumber = 0; + + ExponentialBackoff(int maxNumRetries) { + this.maxNumRetries = maxNumRetries; + } + + public Optional nextBackoff() { + retryNumber += 1; + if (retryNumber > maxNumRetries) { + return Optional.empty(); + } + + int upperBound = (int) Math.pow(2, retryNumber); + return Optional.of(ONE_SECOND.multipliedBy(random.nextInt(upperBound))); + } + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/Stream.java b/v2/src/main/java/com/skyflow/generated/rest/core/Stream.java new file mode 100644 index 00000000..f037712a --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/Stream.java @@ -0,0 +1,97 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.io.Reader; +import java.util.Iterator; +import java.util.NoSuchElementException; +import java.util.Scanner; + +/** + * The {@code Stream} class implements {@link Iterable} to provide a simple mechanism for reading and parsing + * objects of a given type from data streamed via a {@link Reader} using a specified delimiter. + *

+ * {@code Stream} assumes that data is being pushed to the provided {@link Reader} asynchronously and utilizes a + * {@code Scanner} to block during iteration if the next object is not available. + * + * @param The type of objects in the stream. + */ +public final class Stream implements Iterable { + /** + * The {@link Class} of the objects in the stream. + */ + private final Class valueType; + /** + * The {@link Scanner} used for reading from the input stream and blocking when needed during iteration. + */ + private final Scanner scanner; + + /** + * Constructs a new {@code Stream} with the specified value type, reader, and delimiter. + * + * @param valueType The class of the objects in the stream. + * @param reader The reader that provides the streamed data. + * @param delimiter The delimiter used to separate elements in the stream. + */ + public Stream(Class valueType, Reader reader, String delimiter) { + this.scanner = new Scanner(reader).useDelimiter(delimiter); + this.valueType = valueType; + } + + /** + * Returns an iterator over the elements in this stream that blocks during iteration when the next object is + * not yet available. + * + * @return An iterator that can be used to traverse the elements in the stream. + */ + @Override + public Iterator iterator() { + return new Iterator() { + /** + * Returns {@code true} if there are more elements in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return {@code true} if there are more elements, {@code false} otherwise. + */ + @Override + public boolean hasNext() { + return scanner.hasNext(); + } + + /** + * Returns the next element in the stream. + *

+ * Will block and wait for input if the stream has not ended and the next object is not yet available. + * + * @return The next element in the stream. + * @throws NoSuchElementException If there are no more elements in the stream. + */ + @Override + public T next() { + if (!scanner.hasNext()) { + throw new NoSuchElementException(); + } else { + try { + T parsedResponse = ObjectMappers.JSON_MAPPER.readValue( + scanner.next().trim(), valueType); + return parsedResponse; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + } + + /** + * Removing elements from {@code Stream} is not supported. + * + * @throws UnsupportedOperationException Always, as removal is not supported. + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } +} diff --git a/v2/src/main/java/com/skyflow/generated/rest/core/Suppliers.java b/v2/src/main/java/com/skyflow/generated/rest/core/Suppliers.java new file mode 100644 index 00000000..307d5852 --- /dev/null +++ b/v2/src/main/java/com/skyflow/generated/rest/core/Suppliers.java @@ -0,0 +1,23 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ +package com.skyflow.generated.rest.core; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; +import java.util.function.Supplier; + +public final class Suppliers { + private Suppliers() {} + + public static Supplier memoize(Supplier delegate) { + AtomicReference value = new AtomicReference<>(); + return () -> { + T val = value.get(); + if (val == null) { + val = value.updateAndGet(cur -> cur == null ? Objects.requireNonNull(delegate.get()) : cur); + } + return val; + }; + } +} diff --git a/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java b/v2/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java rename to v2/src/main/java/com/skyflow/generated/rest/errors/BadRequestError.java diff --git a/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java b/v2/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java rename to v2/src/main/java/com/skyflow/generated/rest/errors/InternalServerError.java diff --git a/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java b/v2/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java rename to v2/src/main/java/com/skyflow/generated/rest/errors/NotFoundError.java diff --git a/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java b/v2/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java rename to v2/src/main/java/com/skyflow/generated/rest/errors/UnauthorizedError.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java index 0064558d..7e2719f2 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncAuditClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; import com.skyflow.generated.rest.types.V1AuditResponse; + import java.util.concurrent.CompletableFuture; public class AsyncAuditClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java index 875ca259..e1516eaf 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/AsyncRawAuditClient.java @@ -4,27 +4,15 @@ package com.skyflow.generated.rest.resources.audit; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; import com.skyflow.generated.rest.types.V1AuditResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawAuditClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/AuditClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java index bfec3bf2..68cd5e3b 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/RawAuditClient.java @@ -4,23 +4,13 @@ package com.skyflow.generated.rest.resources.audit; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.audit.requests.AuditServiceListAuditEventsRequest; import com.skyflow.generated.rest.types.V1AuditResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawAuditClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java similarity index 98% rename from src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java index 8b6686e4..e9f8cf12 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/requests/AuditServiceListAuditEventsRequest.java @@ -3,26 +3,16 @@ */ package com.skyflow.generated.rest.resources.audit.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestFilterOpsActionType; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestFilterOpsContextAccessType; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestFilterOpsContextActorType; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestFilterOpsContextAuthMode; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestFilterOpsResourceType; -import com.skyflow.generated.rest.resources.audit.types.AuditServiceListAuditEventsRequestSortOpsOrderBy; +import com.skyflow.generated.rest.resources.audit.types.*; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = AuditServiceListAuditEventsRequest.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsActionType.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAccessType.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextActorType.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsContextAuthMode.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestFilterOpsResourceType.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java b/v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/audit/types/AuditServiceListAuditEventsRequestSortOpsOrderBy.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java index f10ed979..fb2d07d0 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncBinLookupClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; import com.skyflow.generated.rest.types.V1BinListResponse; + import java.util.concurrent.CompletableFuture; public class AsyncBinLookupClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java index 2a3f5f4f..9cf03c7d 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/AsyncRawBinLookupClient.java @@ -4,28 +4,15 @@ package com.skyflow.generated.rest.resources.binlookup; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; import com.skyflow.generated.rest.types.V1BinListResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawBinLookupClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/BinLookupClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java index bb08039b..21e77017 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/RawBinLookupClient.java @@ -4,24 +4,13 @@ package com.skyflow.generated.rest.resources.binlookup; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.binlookup.requests.V1BinListRequest; import com.skyflow.generated.rest.types.V1BinListResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawBinLookupClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java index af827e01..def40293 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/binlookup/requests/V1BinListRequest.java @@ -3,21 +3,12 @@ */ package com.skyflow.generated.rest.resources.binlookup.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1VaultSchemaConfig; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1BinListRequest.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java index 1f157223..01031423 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncFilesClient.java @@ -5,20 +5,11 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileAudioRequestDeidentifyAudio; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileDocumentPdfRequestDeidentifyPdf; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileImageRequestDeidentifyImage; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyDocument; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyPresentation; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifySpreadsheet; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyStructuredText; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.files.requests.ReidentifyFileRequestReidentifyFile; +import com.skyflow.generated.rest.resources.files.requests.*; import com.skyflow.generated.rest.types.DeidentifyFileResponse; import com.skyflow.generated.rest.types.DetectRunsResponse; import com.skyflow.generated.rest.types.ReidentifyFileResponse; + import java.util.concurrent.CompletableFuture; public class AsyncFilesClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java index 014f3cf8..e7f008e8 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/AsyncRawFilesClient.java @@ -4,44 +4,20 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileAudioRequestDeidentifyAudio; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileDocumentPdfRequestDeidentifyPdf; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileImageRequestDeidentifyImage; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyDocument; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyPresentation; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifySpreadsheet; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyStructuredText; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.files.requests.ReidentifyFileRequestReidentifyFile; +import com.skyflow.generated.rest.resources.files.requests.*; import com.skyflow.generated.rest.types.DeidentifyFileResponse; import com.skyflow.generated.rest.types.DetectRunsResponse; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.ReidentifyFileResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawFilesClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java index 8d083d76..bcda96e6 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/FilesClient.java @@ -5,17 +5,7 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileAudioRequestDeidentifyAudio; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileDocumentPdfRequestDeidentifyPdf; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileImageRequestDeidentifyImage; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyDocument; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyPresentation; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifySpreadsheet; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyStructuredText; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.files.requests.ReidentifyFileRequestReidentifyFile; +import com.skyflow.generated.rest.resources.files.requests.*; import com.skyflow.generated.rest.types.DeidentifyFileResponse; import com.skyflow.generated.rest.types.DetectRunsResponse; import com.skyflow.generated.rest.types.ReidentifyFileResponse; diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java index 164c4d18..d277d224 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/RawFilesClient.java @@ -4,40 +4,18 @@ package com.skyflow.generated.rest.resources.files; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileAudioRequestDeidentifyAudio; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileDocumentPdfRequestDeidentifyPdf; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileImageRequestDeidentifyImage; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequest; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyDocument; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyPresentation; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifySpreadsheet; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyStructuredText; -import com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText; -import com.skyflow.generated.rest.resources.files.requests.GetRunRequest; -import com.skyflow.generated.rest.resources.files.requests.ReidentifyFileRequestReidentifyFile; +import com.skyflow.generated.rest.resources.files.requests.*; import com.skyflow.generated.rest.types.DeidentifyFileResponse; import com.skyflow.generated.rest.types.DetectRunsResponse; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.ReidentifyFileResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawFilesClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java similarity index 98% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java index d1cadca3..c2baa931 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileAudioRequestDeidentifyAudio.java @@ -3,13 +3,7 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem; @@ -17,13 +11,10 @@ import com.skyflow.generated.rest.types.FileDataDeidentifyAudio; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileAudioRequestDeidentifyAudio.Builder.class) public final class DeidentifyFileAudioRequestDeidentifyAudio { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java index 5b6a653f..1844a116 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileDocumentPdfRequestDeidentifyPdf.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifyPdf; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileDocumentPdfRequestDeidentifyPdf.Builder.class) public final class DeidentifyFileDocumentPdfRequestDeidentifyPdf { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java index 015bba9e..25ddea9c 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileImageRequestDeidentifyImage.java @@ -3,13 +3,7 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileImageRequestDeidentifyImageEntityTypesItem; @@ -17,13 +11,10 @@ import com.skyflow.generated.rest.types.FileDataDeidentifyImage; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileImageRequestDeidentifyImage.Builder.class) public final class DeidentifyFileImageRequestDeidentifyImage { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java index c2cdcfb5..62d77229 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequest.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestEntityTypesItem; import com.skyflow.generated.rest.types.FileData; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequest.Builder.class) public final class DeidentifyFileRequest { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java index fc3db52a..c4d9841d 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyDocument.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyDocumentEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifyDocument; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequestDeidentifyDocument.Builder.class) public final class DeidentifyFileRequestDeidentifyDocument { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java index f45802ec..e1cea77f 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyPresentation.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyPresentationEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifyPresentation; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequestDeidentifyPresentation.Builder.class) public final class DeidentifyFileRequestDeidentifyPresentation { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java index 93ea921a..10ca8feb 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifySpreadsheet.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifySpreadsheet; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequestDeidentifySpreadsheet.Builder.class) public final class DeidentifyFileRequestDeidentifySpreadsheet { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java index b579fe1b..e3f555b8 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyStructuredText.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifyStructuredText; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequestDeidentifyStructuredText.Builder.class) public final class DeidentifyFileRequestDeidentifyStructuredText { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java index 7a7c6615..8457c790 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/DeidentifyFileRequestDeidentifyText.java @@ -3,26 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.files.types.DeidentifyFileRequestDeidentifyTextEntityTypesItem; import com.skyflow.generated.rest.types.FileDataDeidentifyText; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyFileRequestDeidentifyText.Builder.class) public final class DeidentifyFileRequestDeidentifyText { diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java similarity index 86% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java index 490392f1..cde24227 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/GetRunRequest.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java index 0f5e79ab..5cd22747 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/files/requests/ReidentifyFileRequestReidentifyFile.java @@ -3,22 +3,17 @@ */ package com.skyflow.generated.rest.resources.files.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.FileDataReidentifyFile; import com.skyflow.generated.rest.types.Format; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ReidentifyFileRequestReidentifyFile.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileAudioRequestDeidentifyAudioOutputTranscription.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileDocumentPdfRequestDeidentifyPdfEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileImageRequestDeidentifyImageMaskingMethod.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyDocumentEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyPresentationEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifySpreadsheetEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyStructuredTextEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestDeidentifyTextEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/files/types/DeidentifyFileRequestEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java index af874ecd..fa45ee60 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncGuardrailsClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; import com.skyflow.generated.rest.types.DetectGuardrailsResponse; + import java.util.concurrent.CompletableFuture; public class AsyncGuardrailsClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java index 0088d7a3..80853472 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/AsyncRawGuardrailsClient.java @@ -4,31 +4,18 @@ package com.skyflow.generated.rest.resources.guardrails; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; import com.skyflow.generated.rest.types.DetectGuardrailsResponse; import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawGuardrailsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/GuardrailsClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java index 0223134b..5bf5c31a 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/RawGuardrailsClient.java @@ -4,27 +4,16 @@ package com.skyflow.generated.rest.resources.guardrails; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; import com.skyflow.generated.rest.resources.guardrails.requests.DetectGuardrailsRequest; import com.skyflow.generated.rest.types.DetectGuardrailsResponse; import com.skyflow.generated.rest.types.ErrorResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawGuardrailsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java index 9063fed8..75250f8c 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/guardrails/requests/DetectGuardrailsRequest.java @@ -3,22 +3,13 @@ */ package com.skyflow.generated.rest.resources.guardrails.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DetectGuardrailsRequest.Builder.class) public final class DetectGuardrailsRequest { diff --git a/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java index 894c97b5..cab967a7 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncQueryClient.java @@ -7,6 +7,7 @@ import com.skyflow.generated.rest.core.RequestOptions; import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; import com.skyflow.generated.rest.types.V1GetQueryResponse; + import java.util.concurrent.CompletableFuture; public class AsyncQueryClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java index 96e2dc0b..7b8c9383 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/query/AsyncRawQueryClient.java @@ -4,28 +4,15 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; import com.skyflow.generated.rest.types.V1GetQueryResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawQueryClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/query/QueryClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java index 3e5bee51..ec88ae93 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/query/RawQueryClient.java @@ -4,24 +4,13 @@ package com.skyflow.generated.rest.resources.query; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.query.requests.QueryServiceExecuteQueryBody; import com.skyflow.generated.rest.types.V1GetQueryResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawQueryClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java b/v2/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java index 60565eb5..000cd685 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/query/requests/QueryServiceExecuteQueryBody.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.resources.query.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java index a810f142..b1c9ae18 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRawRecordsClient.java @@ -4,54 +4,21 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.FileServiceUploadFileRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DeleteFileResponse; -import com.skyflow.generated.rest.types.V1DeleteRecordResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetFileScanStatusResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.records.requests.*; +import com.skyflow.generated.rest.types.*; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Optional; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawRecordsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java index c6925b50..ed7240c9 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/AsyncRecordsClient.java @@ -5,24 +5,9 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.FileServiceUploadFileRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DeleteFileResponse; -import com.skyflow.generated.rest.types.V1DeleteRecordResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetFileScanStatusResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.records.requests.*; +import com.skyflow.generated.rest.types.*; + import java.io.File; import java.util.Optional; import java.util.concurrent.CompletableFuture; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java index d1b607a0..29530b56 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/RawRecordsClient.java @@ -4,50 +4,19 @@ package com.skyflow.generated.rest.resources.records; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.QueryStringMapper; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.errors.UnauthorizedError; -import com.skyflow.generated.rest.resources.records.requests.FileServiceUploadFileRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.types.ErrorResponse; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DeleteFileResponse; -import com.skyflow.generated.rest.types.V1DeleteRecordResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetFileScanStatusResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.records.requests.*; +import com.skyflow.generated.rest.types.*; +import okhttp3.*; + import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.Optional; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.MediaType; -import okhttp3.MultipartBody; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawRecordsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java index 7b4599c6..eb9bc81d 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/RecordsClient.java @@ -5,24 +5,9 @@ import com.skyflow.generated.rest.core.ClientOptions; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.records.requests.FileServiceUploadFileRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkDeleteRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceBulkGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceGetRecordRequest; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceInsertRecordBody; -import com.skyflow.generated.rest.resources.records.requests.RecordServiceUpdateRecordBody; -import com.skyflow.generated.rest.resources.records.requests.UploadFileV2Request; -import com.skyflow.generated.rest.types.UploadFileV2Response; -import com.skyflow.generated.rest.types.V1BatchOperationResponse; -import com.skyflow.generated.rest.types.V1BulkDeleteRecordResponse; -import com.skyflow.generated.rest.types.V1BulkGetRecordResponse; -import com.skyflow.generated.rest.types.V1DeleteFileResponse; -import com.skyflow.generated.rest.types.V1DeleteRecordResponse; -import com.skyflow.generated.rest.types.V1FieldRecords; -import com.skyflow.generated.rest.types.V1GetFileScanStatusResponse; -import com.skyflow.generated.rest.types.V1InsertRecordResponse; -import com.skyflow.generated.rest.types.V1UpdateRecordResponse; +import com.skyflow.generated.rest.resources.records.requests.*; +import com.skyflow.generated.rest.types.*; + import java.io.File; import java.util.Optional; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java index fe805970..3efb0a98 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/FileServiceUploadFileRequest.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java index 48586839..c1997213 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBatchOperationBody.java @@ -3,22 +3,13 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1BatchRecord; import com.skyflow.generated.rest.types.V1Byot; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = RecordServiceBatchOperationBody.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java similarity index 85% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java index b417adbb..4b9dcced 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkDeleteRecordBody.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = RecordServiceBulkDeleteRecordBody.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java index 22c9090c..9b59168a 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceBulkGetRecordRequest.java @@ -3,23 +3,13 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestOrderBy; import com.skyflow.generated.rest.resources.records.types.RecordServiceBulkGetRecordRequestRedaction; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = RecordServiceBulkGetRecordRequest.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java index eef17665..91317d02 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceGetRecordRequest.java @@ -3,22 +3,12 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.records.types.RecordServiceGetRecordRequestRedaction; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = RecordServiceGetRecordRequest.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java index e1de00f7..e832e396 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceInsertRecordBody.java @@ -3,22 +3,13 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1Byot; import com.skyflow.generated.rest.types.V1FieldRecords; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = RecordServiceInsertRecordBody.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java index e52af2e4..f5c7a229 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/RecordServiceUpdateRecordBody.java @@ -3,17 +3,12 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1Byot; import com.skyflow.generated.rest.types.V1FieldRecords; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java index f162530c..81a9f837 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/records/requests/UploadFileV2Request.java @@ -3,20 +3,15 @@ */ package com.skyflow.generated.rest.resources.records.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = UploadFileV2Request.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestOrderBy.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceBulkGetRecordRequestRedaction.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java b/v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/records/types/RecordServiceGetRecordRequestRedaction.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java index 96428263..36b364b5 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncRawStringsClient.java @@ -4,13 +4,7 @@ package com.skyflow.generated.rest.resources.strings; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; @@ -19,18 +13,11 @@ import com.skyflow.generated.rest.types.DeidentifyStringResponse; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.IdentifyResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawStringsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java index 046bb289..66ef72c5 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/AsyncStringsClient.java @@ -9,6 +9,7 @@ import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; import com.skyflow.generated.rest.types.DeidentifyStringResponse; import com.skyflow.generated.rest.types.IdentifyResponse; + import java.util.concurrent.CompletableFuture; public class AsyncStringsClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java index a5e16949..da6bec56 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/RawStringsClient.java @@ -4,13 +4,7 @@ package com.skyflow.generated.rest.resources.strings; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.BadRequestError; import com.skyflow.generated.rest.errors.InternalServerError; import com.skyflow.generated.rest.errors.UnauthorizedError; @@ -19,14 +13,9 @@ import com.skyflow.generated.rest.types.DeidentifyStringResponse; import com.skyflow.generated.rest.types.ErrorResponse; import com.skyflow.generated.rest.types.IdentifyResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawStringsClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/StringsClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java index 943ddde4..06ec6cec 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/DeidentifyStringRequest.java @@ -3,25 +3,16 @@ */ package com.skyflow.generated.rest.resources.strings.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.resources.strings.types.DeidentifyStringRequestEntityTypesItem; import com.skyflow.generated.rest.types.TokenTypeMapping; import com.skyflow.generated.rest.types.Transformations; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyStringRequest.Builder.class) public final class DeidentifyStringRequest { diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java index 59c1aaf2..3c42390c 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/requests/ReidentifyStringRequest.java @@ -3,16 +3,11 @@ */ package com.skyflow.generated.rest.resources.strings.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.Format; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/strings/types/DeidentifyStringRequestEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java index fbf69580..794035bd 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncRawTokensClient.java @@ -4,30 +4,17 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.V1DetokenizeResponse; import com.skyflow.generated.rest.types.V1TokenizeResponse; +import okhttp3.*; +import org.jetbrains.annotations.NotNull; + import java.io.IOException; import java.util.concurrent.CompletableFuture; -import okhttp3.Call; -import okhttp3.Callback; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; -import org.jetbrains.annotations.NotNull; public class AsyncRawTokensClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java similarity index 99% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java index 26d5ea05..621701af 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/AsyncTokensClient.java @@ -9,6 +9,7 @@ import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.V1DetokenizeResponse; import com.skyflow.generated.rest.types.V1TokenizeResponse; + import java.util.concurrent.CompletableFuture; public class AsyncTokensClient { diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java index 5ed17d28..7ad69d11 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/RawTokensClient.java @@ -4,26 +4,15 @@ package com.skyflow.generated.rest.resources.tokens; import com.fasterxml.jackson.core.JsonProcessingException; -import com.skyflow.generated.rest.core.ApiClientApiException; -import com.skyflow.generated.rest.core.ApiClientException; -import com.skyflow.generated.rest.core.ApiClientHttpResponse; -import com.skyflow.generated.rest.core.ClientOptions; -import com.skyflow.generated.rest.core.MediaTypes; -import com.skyflow.generated.rest.core.ObjectMappers; -import com.skyflow.generated.rest.core.RequestOptions; +import com.skyflow.generated.rest.core.*; import com.skyflow.generated.rest.errors.NotFoundError; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; import com.skyflow.generated.rest.types.V1DetokenizeResponse; import com.skyflow.generated.rest.types.V1TokenizeResponse; +import okhttp3.*; + import java.io.IOException; -import okhttp3.Headers; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; -import okhttp3.ResponseBody; public class RawTokensClient { protected final ClientOptions clientOptions; diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/TokensClient.java diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java index 59318aa8..52571f64 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1DetokenizePayload.java @@ -3,21 +3,12 @@ */ package com.skyflow.generated.rest.resources.tokens.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1DetokenizeRecordRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1DetokenizePayload.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java similarity index 85% rename from src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java rename to v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java index 9729023e..e5fc08f4 100644 --- a/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java +++ b/v2/src/main/java/com/skyflow/generated/rest/resources/tokens/requests/V1TokenizePayload.java @@ -3,21 +3,12 @@ */ package com.skyflow.generated.rest.resources.tokens.requests; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; import com.skyflow.generated.rest.types.V1TokenizeRecordRequest; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1TokenizePayload.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/AuditEventAuditResourceType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java rename to v2/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java index 210f96c0..73aed9c1 100644 --- a/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventContext.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/types/AuditEventData.java rename to v2/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java index e2028fba..bab4b42a 100644 --- a/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventData.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java rename to v2/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java index 1352c42f..9d3bbaed 100644 --- a/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/AuditEventHttpInfo.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java b/v2/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java rename to v2/src/main/java/com/skyflow/generated/rest/types/BatchRecordMethod.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java b/v2/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ContextAccessType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java b/v2/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ContextAuthMode.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java index a7dd7c68..dc244be8 100644 --- a/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutput.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileExtension.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DeidentifiedFileOutputProcessedFileType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java index d2b8e5b6..d5a2ebd5 100644 --- a/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyFileResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java index e831f142..1389fa0f 100644 --- a/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/DeidentifyStringResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DeidentifyStringResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java index 9773dcc3..9cb2d319 100644 --- a/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponse.java @@ -3,20 +3,15 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DetectGuardrailsResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetectGuardrailsResponseValidation.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java index c97f7635..b73f7845 100644 --- a/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = DetectRunsResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseOutputType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetectRunsResponseStatus.java diff --git a/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java b/v2/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/DetokenizeRecordResponseValueType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java index 565714eb..4113b998 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponse.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java b/v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java index bcc23f03..4774fa57 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ErrorResponseError.java @@ -3,22 +3,13 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; import org.jetbrains.annotations.NotNull; +import java.util.*; + @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ErrorResponseError.Builder.class) public final class ErrorResponseError { diff --git a/src/main/java/com/skyflow/generated/rest/types/FileData.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileData.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileData.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileData.java index 7f58332e..fd6fa822 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileData.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileData.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileData.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java index 2aa88f7b..b6a5ea11 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudio.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyAudio.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyAudioDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java index e6390e28..5fb12fba 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocument.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyDocument.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyDocumentDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java index 127c5f4c..bc5e2c6b 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImage.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyImage.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyImageDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java index 20b0314f..5606e917 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPdf.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyPdf.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java index e808f0b2..0bedabc5 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentation.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyPresentation.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyPresentationDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java index 33478d20..dd017bb8 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheet.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifySpreadsheet.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifySpreadsheetDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java index dad188ce..814d51c3 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredText.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyStructuredText.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyStructuredTextDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java index 79045d7a..e5c88180 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataDeidentifyText.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataDeidentifyText.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java index edea3145..9148703c 100644 --- a/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFile.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = FileDataReidentifyFile.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java b/v2/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FileDataReidentifyFileDataFormat.java diff --git a/src/main/java/com/skyflow/generated/rest/types/Format.java b/v2/src/main/java/com/skyflow/generated/rest/types/Format.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/types/Format.java rename to v2/src/main/java/com/skyflow/generated/rest/types/Format.java index 68ac94ca..1563b90a 100644 --- a/src/main/java/com/skyflow/generated/rest/types/Format.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/Format.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = Format.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FormatMaskedItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FormatPlaintextItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/FormatRedactedItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java b/v2/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java similarity index 88% rename from src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java rename to v2/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java index 807aee4e..55be5699 100644 --- a/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/GooglerpcStatus.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = GooglerpcStatus.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java index e7ae30fc..c1bd23c6 100644 --- a/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/IdentifyResponse.java @@ -3,18 +3,14 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; +import org.jetbrains.annotations.NotNull; + import java.util.HashMap; import java.util.Map; import java.util.Objects; -import org.jetbrains.annotations.NotNull; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = IdentifyResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/Locations.java b/v2/src/main/java/com/skyflow/generated/rest/types/Locations.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/types/Locations.java rename to v2/src/main/java/com/skyflow/generated/rest/types/Locations.java index 9864541a..4b95c485 100644 --- a/src/main/java/com/skyflow/generated/rest/types/Locations.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/Locations.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java b/v2/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java similarity index 86% rename from src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java index 9f019b66..40e73b99 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ProtobufAny.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java b/v2/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java rename to v2/src/main/java/com/skyflow/generated/rest/types/RedactionEnumRedaction.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java index b5a4f6f5..a12660cb 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutput.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ReidentifiedFileOutputProcessedFileExtension.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java index 024200d1..b7bc22ca 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseOutputType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java b/v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ReidentifyFileResponseStatus.java diff --git a/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java b/v2/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/RequestActionType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/RequestActionType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java b/v2/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/types/ShiftDates.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java index 2fc4b11a..37ef8cdf 100644 --- a/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/ShiftDates.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = ShiftDates.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/ShiftDatesEntityTypesItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java b/v2/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java similarity index 94% rename from src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java rename to v2/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java index 81c1e58d..78df8838 100644 --- a/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/StringResponseEntities.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java rename to v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java index f8c1edb4..b703895d 100644 --- a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMapping.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = TokenTypeMapping.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java rename to v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingDefault.java diff --git a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityOnlyItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingEntityUnqCounterItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java b/v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java rename to v2/src/main/java/com/skyflow/generated/rest/types/TokenTypeMappingVaultTokenItem.java diff --git a/src/main/java/com/skyflow/generated/rest/types/Transformations.java b/v2/src/main/java/com/skyflow/generated/rest/types/Transformations.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/types/Transformations.java rename to v2/src/main/java/com/skyflow/generated/rest/types/Transformations.java index 12a5afc7..c9165409 100644 --- a/src/main/java/com/skyflow/generated/rest/types/Transformations.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/Transformations.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java b/v2/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java rename to v2/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java index c1ddbd58..8f5fea5a 100644 --- a/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/UploadFileV2Response.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java index d942fdcd..037b80bf 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditAfterOptions.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java index c582d06d..f7ca73f0 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditEventResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java similarity index 86% rename from src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java index dd23d77c..36d7ccce 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1AuditResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java index ca2bfdc2..a54eec6c 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEvent.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1AuditResponseEvent.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java similarity index 95% rename from src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java index 046c8fb4..90d9c538 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1AuditResponseEventRequest.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1AuditResponseEventRequest.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java similarity index 89% rename from src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java index a557da82..8f5fb775 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1BatchOperationResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1BatchOperationResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java similarity index 97% rename from src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java index afc572cf..3f0455cc 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1BatchRecord.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java similarity index 83% rename from src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java index 58472a8b..88c1c125 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1BinListResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1BinListResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java similarity index 85% rename from src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java index ddb0d213..b7151598 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1BulkDeleteRecordResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1BulkDeleteRecordResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java similarity index 83% rename from src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java index c2d3790a..27878fab 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1BulkGetRecordResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1BulkGetRecordResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1Byot.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1Byot.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/V1Byot.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1Byot.java diff --git a/src/main/java/com/skyflow/generated/rest/types/V1Card.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1Card.java similarity index 96% rename from src/main/java/com/skyflow/generated/rest/types/V1Card.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1Card.java index f2a9db90..ba4f7349 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1Card.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1Card.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java index 4ec85903..4d9b24eb 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteFileResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java index 2f3bde14..5351d897 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1DeleteRecordResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java index 3cf5b59c..b6fb9cb6 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordRequest.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java similarity index 93% rename from src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java index ba0abbfa..dd3a9c1f 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeRecordResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java similarity index 84% rename from src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java index 74f4f6e6..53660cbe 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1DetokenizeResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1DetokenizeResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java index dfbccb8b..b64b8792 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1FieldRecords.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1FileAvScanStatus.java diff --git a/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java index f5669085..43a86ae0 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetAuthTokenResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java index 4bd67013..3138c766 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetFileScanStatusResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java similarity index 83% rename from src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java index 821d1f06..a44b0f62 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1GetQueryResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1GetQueryResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java similarity index 84% rename from src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java index 0addf786..f8a00001 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1InsertRecordResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1InsertRecordResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java similarity index 100% rename from src/main/java/com/skyflow/generated/rest/types/V1MemberType.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1MemberType.java diff --git a/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java index f69719cf..17f77df6 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1RecordMetaProperties.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java index 2c15ceac..43fe264a 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordRequest.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java similarity index 87% rename from src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java index 201a4f60..66721fa1 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeRecordResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java similarity index 84% rename from src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java index 62d77bed..05e64bc0 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1TokenizeResponse.java @@ -3,20 +3,11 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; + +import java.util.*; @JsonInclude(JsonInclude.Include.NON_ABSENT) @JsonDeserialize(builder = V1TokenizeResponse.Builder.class) diff --git a/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java index 03ed7b58..d2fcbf1b 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1UpdateRecordResponse.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java similarity index 92% rename from src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java index c19d1cb5..6fc09854 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1VaultFieldMapping.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java b/v2/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java similarity index 91% rename from src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java rename to v2/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java index cd838305..1542ab0f 100644 --- a/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/V1VaultSchemaConfig.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java b/v2/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java similarity index 90% rename from src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java rename to v2/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java index 594b6d11..314b5942 100644 --- a/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java +++ b/v2/src/main/java/com/skyflow/generated/rest/types/WordCharacterCount.java @@ -3,15 +3,10 @@ */ package com.skyflow.generated.rest.types; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonSetter; -import com.fasterxml.jackson.annotation.Nulls; +import com.fasterxml.jackson.annotation.*; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.skyflow.generated.rest.core.ObjectMappers; + import java.util.HashMap; import java.util.Map; import java.util.Objects; diff --git a/v2/src/main/java/com/skyflow/utils/Constants.java b/v2/src/main/java/com/skyflow/utils/Constants.java new file mode 100644 index 00000000..2ca105d5 --- /dev/null +++ b/v2/src/main/java/com/skyflow/utils/Constants.java @@ -0,0 +1,42 @@ +package com.skyflow.utils; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public final class Constants extends BaseConstants { + public static final String SDK_NAME = "Skyflow Java SDK"; + public static final String DEFAULT_SDK_VERSION = "v2"; + public static final String SDK_VERSION; + public static final String SDK_PREFIX; + public static final String SDK_METRIC_NAME_VERSION_PREFIX = "skyflow-java@"; + public static final String PROCESSED_FILE_NAME_PREFIX = "processed-"; + public static final String DEIDENTIFIED_FILE_PREFIX = "deidentified"; + public static final String HTTPS_PROTOCOL = "https"; + public static final String CURLY_PLACEHOLDER = "{%s}"; + public static final String EMPTY_STRING = ""; + public static final String QUOTE = "\""; + + public static final class HttpUtilityExtra { + public static final String SDK_GENERATED_PREFIX = "SDK-Generated-"; + private HttpUtilityExtra() {} + } + + static { + String sdkVersion; + // Use a static initializer block to read the properties file + Properties properties = new Properties(); + try (InputStream input = Constants.class.getClassLoader().getResourceAsStream("sdk.properties")) { + if (input == null) { + sdkVersion = DEFAULT_SDK_VERSION; + } else { + properties.load(input); + sdkVersion = properties.getProperty("sdk.version", DEFAULT_SDK_VERSION); + } + } catch (IOException ex) { + sdkVersion = DEFAULT_SDK_VERSION; + } + SDK_VERSION = sdkVersion; + SDK_PREFIX = SDK_NAME + " " + SDK_VERSION; + } +} diff --git a/src/main/java/com/skyflow/utils/HttpUtility.java b/v2/src/main/java/com/skyflow/utils/HttpUtility.java similarity index 100% rename from src/main/java/com/skyflow/utils/HttpUtility.java rename to v2/src/main/java/com/skyflow/utils/HttpUtility.java diff --git a/v2/src/main/java/com/skyflow/utils/Utils.java b/v2/src/main/java/com/skyflow/utils/Utils.java new file mode 100644 index 00000000..b5f81769 --- /dev/null +++ b/v2/src/main/java/com/skyflow/utils/Utils.java @@ -0,0 +1,55 @@ +package com.skyflow.utils; + +import com.google.gson.JsonObject; +import com.skyflow.config.ConnectionConfig; +import com.skyflow.enums.Env; +import com.skyflow.vault.connection.InvokeConnectionRequest; + +import java.util.HashMap; +import java.util.Map; + +public final class Utils extends BaseUtils { + public static String getVaultURL(String clusterId, Env env) { + return getVaultURL(clusterId, env, BaseConstants.V2_VAULT_DOMAIN); + } + + public static String constructConnectionURL(ConnectionConfig config, InvokeConnectionRequest invokeConnectionRequest) { + StringBuilder filledURL = new StringBuilder(config.getConnectionUrl()); + + if (invokeConnectionRequest.getPathParams() != null && !invokeConnectionRequest.getPathParams().isEmpty()) { + for (Map.Entry entry : invokeConnectionRequest.getPathParams().entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + filledURL = new StringBuilder(filledURL.toString().replace(String.format(Constants.CURLY_PLACEHOLDER, key), value)); + } + } + + if (invokeConnectionRequest.getQueryParams() != null && !invokeConnectionRequest.getQueryParams().isEmpty()) { + filledURL.append("?"); + for (Map.Entry entry : invokeConnectionRequest.getQueryParams().entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + filledURL.append(key).append("=").append(value).append("&"); + } + filledURL = new StringBuilder(filledURL.substring(0, filledURL.length() - 1)); + } + + return filledURL.toString(); + } + + public static Map constructConnectionHeadersMap(Map requestHeaders) { + Map headersMap = new HashMap<>(); + for (Map.Entry entry : requestHeaders.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + headersMap.put(key.toLowerCase(), value); + } + return headersMap; + } + + public static JsonObject getMetrics() { + JsonObject details = getCommonMetrics(); + details.addProperty(Constants.SDK_METRIC_NAME_VERSION, Constants.SDK_METRIC_NAME_VERSION_PREFIX + Constants.SDK_VERSION); + return details; + } +} diff --git a/src/main/java/com/skyflow/utils/logger/LogUtil.java b/v2/src/main/java/com/skyflow/utils/logger/LogUtil.java similarity index 100% rename from src/main/java/com/skyflow/utils/logger/LogUtil.java rename to v2/src/main/java/com/skyflow/utils/logger/LogUtil.java diff --git a/src/main/java/com/skyflow/utils/validations/Validations.java b/v2/src/main/java/com/skyflow/utils/validations/Validations.java similarity index 89% rename from src/main/java/com/skyflow/utils/validations/Validations.java rename to v2/src/main/java/com/skyflow/utils/validations/Validations.java index 5e528a6a..ff46c409 100644 --- a/src/main/java/com/skyflow/utils/validations/Validations.java +++ b/v2/src/main/java/com/skyflow/utils/validations/Validations.java @@ -6,11 +6,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.skyflow.config.BaseVaultConfig; import com.skyflow.config.ConnectionConfig; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; @@ -41,7 +40,7 @@ import com.skyflow.vault.tokens.DetokenizeRequest; import com.skyflow.vault.tokens.TokenizeRequest; -public class Validations { +public class Validations extends BaseValidations { private Validations() { } @@ -159,97 +158,6 @@ public static void validateInvokeConnectionRequest(InvokeConnectionRequest invok } } - public static void validateCredentials(Credentials credentials) throws SkyflowException { - int nonNullMembers = 0; - String path = credentials.getPath(); - String credentialsString = credentials.getCredentialsString(); - String token = credentials.getToken(); - String apiKey = credentials.getApiKey(); - Object context = credentials.getContext(); - ArrayList roles = credentials.getRoles(); - - if (path != null) nonNullMembers++; - if (credentialsString != null) nonNullMembers++; - if (token != null) nonNullMembers++; - if (apiKey != null) nonNullMembers++; - - if (nonNullMembers > 1) { - LogUtil.printErrorLog(ErrorLogs.MULTIPLE_TOKEN_GENERATION_MEANS_PASSED.getLog()); - throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.MultipleTokenGenerationMeansPassed.getMessage() - ); - } else if (nonNullMembers < 1) { - LogUtil.printErrorLog(ErrorLogs.NO_TOKEN_GENERATION_MEANS_PASSED.getLog()); - throw new SkyflowException( - ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.NoTokenGenerationMeansPassed.getMessage() - ); - } else if (path != null && path.trim().isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_PATH.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialFilePath.getMessage()); - } else if (credentialsString != null && credentialsString.trim().isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_CREDENTIALS_STRING.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyCredentialsString.getMessage()); - } else if (token != null && token.trim().isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_TOKEN_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyToken.getMessage()); - } else if (apiKey != null) { - if (apiKey.trim().isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_API_KEY_VALUE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyApikey.getMessage()); - } else { - Pattern pattern = Pattern.compile(Constants.API_KEY_REGEX); - Matcher matcher = pattern.matcher(apiKey); - if (!matcher.matches()) { - LogUtil.printErrorLog(ErrorLogs.INVALID_API_KEY.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidApikey.getMessage()); - } - } - } else if (roles != null) { - if (roles.isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_ROLES.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoles.getMessage()); - } else { - for (int index = 0; index < roles.size(); index++) { - String role = roles.get(index); - if (role == null || role.trim().isEmpty()) { - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.EMPTY_OR_NULL_ROLE_IN_ROLES.getLog(), Integer.toString(index) - )); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyRoleInRoles.getMessage()); - } - } - } - } - if (context != null) { - if (context instanceof String) { - String ctxStr = (String) context; - if (ctxStr.trim().isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); - } - } else if (context instanceof Map) { - Map ctxMap = (Map) context; - if (ctxMap.isEmpty()) { - LogUtil.printErrorLog(ErrorLogs.EMPTY_OR_NULL_CONTEXT.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.EmptyContext.getMessage()); - } - Pattern ctxKeyPattern = Pattern.compile(Constants.CONTEXT_KEY_REGEX); - for (Object key : ctxMap.keySet()) { - if (key == null || !ctxKeyPattern.matcher(key.toString()).matches()) { - String keyStr = key == null ? "null" : key.toString(); - LogUtil.printErrorLog(Utils.parameterizedString( - ErrorLogs.INVALID_CONTEXT_MAP_KEY.getLog(), keyStr)); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), - Utils.parameterizedString(ErrorMessage.InvalidContextMapKey.getMessage(), keyStr)); - } - } - } else { - LogUtil.printErrorLog(ErrorLogs.INVALID_CONTEXT_TYPE.getLog()); - throw new SkyflowException(ErrorCode.INVALID_INPUT.getCode(), ErrorMessage.InvalidContextType.getMessage()); - } - } - } - public static void validateDetokenizeRequest(DetokenizeRequest detokenizeRequest) throws SkyflowException { ArrayList detokenizeData = detokenizeRequest.getDetokenizeData(); if (detokenizeData == null) { diff --git a/src/main/java/com/skyflow/vault/audit/ListEventRequest.java b/v2/src/main/java/com/skyflow/vault/audit/ListEventRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/audit/ListEventRequest.java rename to v2/src/main/java/com/skyflow/vault/audit/ListEventRequest.java diff --git a/src/main/java/com/skyflow/vault/audit/ListEventResponse.java b/v2/src/main/java/com/skyflow/vault/audit/ListEventResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/audit/ListEventResponse.java rename to v2/src/main/java/com/skyflow/vault/audit/ListEventResponse.java diff --git a/src/main/java/com/skyflow/vault/bin/GetBinRequest.java b/v2/src/main/java/com/skyflow/vault/bin/GetBinRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/bin/GetBinRequest.java rename to v2/src/main/java/com/skyflow/vault/bin/GetBinRequest.java diff --git a/src/main/java/com/skyflow/vault/bin/GetBinResponse.java b/v2/src/main/java/com/skyflow/vault/bin/GetBinResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/bin/GetBinResponse.java rename to v2/src/main/java/com/skyflow/vault/bin/GetBinResponse.java diff --git a/src/main/java/com/skyflow/vault/connection/InvokeConnectionRequest.java b/v2/src/main/java/com/skyflow/vault/connection/InvokeConnectionRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/connection/InvokeConnectionRequest.java rename to v2/src/main/java/com/skyflow/vault/connection/InvokeConnectionRequest.java diff --git a/src/main/java/com/skyflow/vault/connection/InvokeConnectionResponse.java b/v2/src/main/java/com/skyflow/vault/connection/InvokeConnectionResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/connection/InvokeConnectionResponse.java rename to v2/src/main/java/com/skyflow/vault/connection/InvokeConnectionResponse.java diff --git a/src/main/java/com/skyflow/vault/controller/AuditController.java b/v2/src/main/java/com/skyflow/vault/controller/AuditController.java similarity index 100% rename from src/main/java/com/skyflow/vault/controller/AuditController.java rename to v2/src/main/java/com/skyflow/vault/controller/AuditController.java diff --git a/src/main/java/com/skyflow/vault/controller/BinLookupController.java b/v2/src/main/java/com/skyflow/vault/controller/BinLookupController.java similarity index 100% rename from src/main/java/com/skyflow/vault/controller/BinLookupController.java rename to v2/src/main/java/com/skyflow/vault/controller/BinLookupController.java diff --git a/src/main/java/com/skyflow/vault/controller/ConnectionController.java b/v2/src/main/java/com/skyflow/vault/controller/ConnectionController.java similarity index 100% rename from src/main/java/com/skyflow/vault/controller/ConnectionController.java rename to v2/src/main/java/com/skyflow/vault/controller/ConnectionController.java diff --git a/src/main/java/com/skyflow/vault/controller/DetectController.java b/v2/src/main/java/com/skyflow/vault/controller/DetectController.java similarity index 99% rename from src/main/java/com/skyflow/vault/controller/DetectController.java rename to v2/src/main/java/com/skyflow/vault/controller/DetectController.java index 873c83e1..ad25d7e2 100644 --- a/src/main/java/com/skyflow/vault/controller/DetectController.java +++ b/v2/src/main/java/com/skyflow/vault/controller/DetectController.java @@ -8,12 +8,12 @@ import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; import com.skyflow.errors.SkyflowException; +import com.skyflow.generated.rest.resources.files.requests.*; +import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.core.ApiClientApiException; import com.skyflow.generated.rest.core.RequestOptions; -import com.skyflow.generated.rest.resources.files.requests.*; import com.skyflow.generated.rest.resources.strings.requests.DeidentifyStringRequest; import com.skyflow.generated.rest.resources.strings.requests.ReidentifyStringRequest; -import com.skyflow.generated.rest.types.*; import com.skyflow.logs.ErrorLogs; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.Constants; @@ -352,7 +352,7 @@ private String extractBodyAsString(ApiClientApiException e) { private com.skyflow.generated.rest.types.DeidentifyFileResponse processFileByType(String fileExtension, String base64Content, DeidentifyFileRequest request, String vaultId) throws SkyflowException { switch (fileExtension.toLowerCase()) { case "txt": - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText textFileRequest = + DeidentifyFileRequestDeidentifyText textFileRequest = super.getDeidentifyTextFileRequest(request, vaultId, base64Content); return super.getDetectFileAPi().deidentifyText(textFileRequest); @@ -424,7 +424,7 @@ public DeidentifyFileResponse getDetectRun(GetDetectRunRequest request) throws S .vaultId(vaultId) .build(); - com.skyflow.generated.rest.types.DetectRunsResponse apiResponse = + DetectRunsResponse apiResponse = super.getDetectFileAPi().getRun(runId, getRunRequest); return parseDeidentifyFileResponse(apiResponse, runId, apiResponse.getStatus().toString()); diff --git a/src/main/java/com/skyflow/vault/controller/VaultController.java b/v2/src/main/java/com/skyflow/vault/controller/VaultController.java similarity index 88% rename from src/main/java/com/skyflow/vault/controller/VaultController.java rename to v2/src/main/java/com/skyflow/vault/controller/VaultController.java index 1812b83b..1d82ac12 100644 --- a/src/main/java/com/skyflow/vault/controller/VaultController.java +++ b/v2/src/main/java/com/skyflow/vault/controller/VaultController.java @@ -17,6 +17,7 @@ import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; import com.skyflow.VaultClient; +import com.skyflow.config.BaseVaultConfig; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.enums.RedactionType; @@ -73,10 +74,15 @@ import com.skyflow.vault.tokens.TokenizeRequest; import com.skyflow.vault.tokens.TokenizeResponse; -public final class VaultController extends VaultClient { +public final class VaultController extends VaultClient + implements IVaultController { private static final Gson GSON = new GsonBuilder().serializeNulls().create(); private static final JsonObject SKY_METADATA = Utils.getMetrics(); + private static RequestOptions buildRequestOptions() { + return RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + } + public VaultController(VaultConfig vaultConfig, Credentials credentials) { super(vaultConfig, credentials); } @@ -181,6 +187,7 @@ private static synchronized HashMap getFormattedQueryRecord(V1Fi return queryRecord; } + @Override public InsertResponse insert(InsertRequest insertRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.INSERT_TRIGGERED.getLog()); V1InsertRecordResponse bulkInsertResult = null; @@ -194,7 +201,7 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio setBearerToken(); if (continueOnError) { RecordServiceBatchOperationBody insertBody = super.getBatchInsertRequestBody(insertRequest); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); batchInsertResult = super.getRecordsApi().withRawResponse().recordServiceBatchOperation(super.getVaultConfig().getVaultId(), insertBody, requestOptions); LogUtil.printInfoLog(InfoLogs.INSERT_REQUEST_RESOLVED.getLog()); Optional>> records = batchInsertResult.body().getResponses(); @@ -229,9 +236,7 @@ public InsertResponse insert(InsertRequest insertRequest) throws SkyflowExceptio } } } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.INSERT_RECORDS_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.INSERT_RECORDS_REJECTED); } LogUtil.printInfoLog(InfoLogs.INSERT_SUCCESS.getLog()); if (insertedFields.isEmpty()) { @@ -253,7 +258,7 @@ public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws Validations.validateDetokenizeRequest(detokenizeRequest); setBearerToken(); V1DetokenizePayload payload = super.getDetokenizePayload(detokenizeRequest); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getTokensApi().withRawResponse().recordServiceDetokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.DETOKENIZE_REQUEST_RESOLVED.getLog()); Map> responseHeaders = result.headers(); @@ -274,9 +279,7 @@ public DetokenizeResponse detokenize(DetokenizeRequest detokenizeRequest) throws } } } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.DETOKENIZE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.DETOKENIZE_REQUEST_REJECTED); } if (!errorRecords.isEmpty()) { @@ -316,7 +319,7 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { .orderBy(RecordServiceBulkGetRecordRequestOrderBy.valueOf(getRequest.getOrderBy())) .build(); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getRecordsApi().recordServiceBulkGetRecord( super.getVaultConfig().getVaultId(), getRequest.getTable(), @@ -331,9 +334,7 @@ public GetResponse get(GetRequest getRequest) throws SkyflowException { } } } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.GET_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.GET_REQUEST_REJECTED); } LogUtil.printInfoLog(InfoLogs.GET_SUCCESS.getLog()); return new GetResponse(data, null); @@ -349,7 +350,7 @@ public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowExceptio Validations.validateUpdateRequest(updateRequest); setBearerToken(); RecordServiceUpdateRecordBody updateBody = super.getUpdateRequestBody(updateRequest); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getRecordsApi().recordServiceUpdateRecord( super.getVaultConfig().getVaultId(), updateRequest.getTable(), @@ -361,9 +362,7 @@ public UpdateResponse update(UpdateRequest updateRequest) throws SkyflowExceptio skyflowId = String.valueOf(result.getSkyflowId()); tokensMap = getFormattedUpdateRecord(result); } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.UPDATE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.UPDATE_REQUEST_REJECTED); } LogUtil.printInfoLog(InfoLogs.UPDATE_SUCCESS.getLog()); return new UpdateResponse(skyflowId, tokensMap); @@ -379,14 +378,12 @@ public DeleteResponse delete(DeleteRequest deleteRequest) throws SkyflowExceptio RecordServiceBulkDeleteRecordBody deleteBody = RecordServiceBulkDeleteRecordBody.builder().skyflowIds(deleteRequest.getIds()) .build(); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getRecordsApi().recordServiceBulkDeleteRecord( super.getVaultConfig().getVaultId(), deleteRequest.getTable(), deleteBody, requestOptions); LogUtil.printInfoLog(InfoLogs.DELETE_REQUEST_RESOLVED.getLog()); } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.DELETE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.DELETE_REQUEST_REJECTED); } LogUtil.printInfoLog(InfoLogs.DELETE_SUCCESS.getLog()); return new DeleteResponse(result.getRecordIdResponse().orElse(Collections.emptyList())); @@ -400,7 +397,7 @@ public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { LogUtil.printInfoLog(InfoLogs.VALIDATING_QUERY_REQUEST.getLog()); Validations.validateQueryRequest(queryRequest); setBearerToken(); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getQueryApi().queryServiceExecuteQuery( super.getVaultConfig().getVaultId(), QueryServiceExecuteQueryBody.builder().query(queryRequest.getQuery()).build(), @@ -414,9 +411,7 @@ public QueryResponse query(QueryRequest queryRequest) throws SkyflowException { } } } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.QUERY_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.QUERY_REQUEST_REJECTED); } LogUtil.printInfoLog(InfoLogs.QUERY_SUCCESS.getLog()); return new QueryResponse(fields); @@ -431,7 +426,7 @@ public TokenizeResponse tokenize(TokenizeRequest tokenizeRequest) throws Skyflow Validations.validateTokenizeRequest(tokenizeRequest); setBearerToken(); V1TokenizePayload payload = super.getTokenizePayload(tokenizeRequest); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); result = super.getTokensApi().recordServiceTokenize(super.getVaultConfig().getVaultId(), payload, requestOptions); LogUtil.printInfoLog(InfoLogs.TOKENIZE_REQUEST_RESOLVED.getLog()); if (result != null && result.getRecords().isPresent() && !result.getRecords().get().isEmpty()) { @@ -442,9 +437,7 @@ public TokenizeResponse tokenize(TokenizeRequest tokenizeRequest) throws Skyflow } } } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.TOKENIZE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.TOKENIZE_REQUEST_REJECTED); } LogUtil.printInfoLog(InfoLogs.TOKENIZE_SUCCESS.getLog()); return new TokenizeResponse(list); @@ -467,7 +460,7 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws .returnFileMetadata(false) .build(); - RequestOptions requestOptions = RequestOptions.builder().addHeader(Constants.SDK_METRICS_HEADER_KEY, SKY_METADATA.toString()).build(); + RequestOptions requestOptions = buildRequestOptions(); UploadFileV2Response uploadFileV2Response = super.getRecordsApi().uploadFileV2( super.getVaultConfig().getVaultId(), file, @@ -481,9 +474,7 @@ public FileUploadResponse uploadFile(FileUploadRequest fileUploadRequest) throws ); } catch (ApiClientApiException e) { - String bodyString = GSON.toJson(e.body()); - LogUtil.printErrorLog(ErrorLogs.UPLOAD_FILE_REQUEST_REJECTED.getLog()); - throw new SkyflowException(e.statusCode(), e, e.headers(), bodyString); + throw wrapApiException(e.statusCode(), e, e.headers(), e.body(), ErrorLogs.UPLOAD_FILE_REQUEST_REJECTED); } catch (IOException e) { LogUtil.printErrorLog(ErrorLogs.UPLOAD_FILE_REQUEST_REJECTED.getLog()); throw new SkyflowException(e.getMessage(), e); diff --git a/src/main/java/com/skyflow/vault/data/DeleteRequest.java b/v2/src/main/java/com/skyflow/vault/data/DeleteRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/DeleteRequest.java rename to v2/src/main/java/com/skyflow/vault/data/DeleteRequest.java diff --git a/src/main/java/com/skyflow/vault/data/DeleteResponse.java b/v2/src/main/java/com/skyflow/vault/data/DeleteResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/DeleteResponse.java rename to v2/src/main/java/com/skyflow/vault/data/DeleteResponse.java diff --git a/src/main/java/com/skyflow/vault/data/FileUploadRequest.java b/v2/src/main/java/com/skyflow/vault/data/FileUploadRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/FileUploadRequest.java rename to v2/src/main/java/com/skyflow/vault/data/FileUploadRequest.java diff --git a/src/main/java/com/skyflow/vault/data/FileUploadResponse.java b/v2/src/main/java/com/skyflow/vault/data/FileUploadResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/FileUploadResponse.java rename to v2/src/main/java/com/skyflow/vault/data/FileUploadResponse.java diff --git a/src/main/java/com/skyflow/vault/data/GetRequest.java b/v2/src/main/java/com/skyflow/vault/data/GetRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/GetRequest.java rename to v2/src/main/java/com/skyflow/vault/data/GetRequest.java diff --git a/src/main/java/com/skyflow/vault/data/GetResponse.java b/v2/src/main/java/com/skyflow/vault/data/GetResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/GetResponse.java rename to v2/src/main/java/com/skyflow/vault/data/GetResponse.java diff --git a/src/main/java/com/skyflow/vault/data/InsertRequest.java b/v2/src/main/java/com/skyflow/vault/data/InsertRequest.java similarity index 94% rename from src/main/java/com/skyflow/vault/data/InsertRequest.java rename to v2/src/main/java/com/skyflow/vault/data/InsertRequest.java index 54093467..f2127a77 100644 --- a/src/main/java/com/skyflow/vault/data/InsertRequest.java +++ b/v2/src/main/java/com/skyflow/vault/data/InsertRequest.java @@ -5,13 +5,15 @@ import java.util.ArrayList; import java.util.HashMap; -public class InsertRequest { +public class InsertRequest extends BaseInsertRequest{ private final InsertRequestBuilder builder; private InsertRequest(InsertRequestBuilder builder) { + super(builder); this.builder = builder; } + public static InsertRequestBuilder builder() { return new InsertRequestBuilder(); } @@ -48,7 +50,7 @@ public TokenMode getTokenMode() { return this.builder.tokenMode; } - public static final class InsertRequestBuilder { + public static final class InsertRequestBuilder extends BaseInsertRequestBuilder{ private String table; private ArrayList> values; private ArrayList> tokens; diff --git a/v2/src/main/java/com/skyflow/vault/data/InsertResponse.java b/v2/src/main/java/com/skyflow/vault/data/InsertResponse.java new file mode 100644 index 00000000..bc09b0c2 --- /dev/null +++ b/v2/src/main/java/com/skyflow/vault/data/InsertResponse.java @@ -0,0 +1,12 @@ +package com.skyflow.vault.data; + +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.HashMap; + +public class InsertResponse extends BaseInsertResponse { + public InsertResponse(ArrayList> insertedFields, ArrayList> errors) { + super(insertedFields, errors); + } +} diff --git a/src/main/java/com/skyflow/vault/data/QueryRequest.java b/v2/src/main/java/com/skyflow/vault/data/QueryRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/QueryRequest.java rename to v2/src/main/java/com/skyflow/vault/data/QueryRequest.java diff --git a/src/main/java/com/skyflow/vault/data/QueryResponse.java b/v2/src/main/java/com/skyflow/vault/data/QueryResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/QueryResponse.java rename to v2/src/main/java/com/skyflow/vault/data/QueryResponse.java diff --git a/src/main/java/com/skyflow/vault/data/UpdateRequest.java b/v2/src/main/java/com/skyflow/vault/data/UpdateRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/UpdateRequest.java rename to v2/src/main/java/com/skyflow/vault/data/UpdateRequest.java diff --git a/src/main/java/com/skyflow/vault/data/UpdateResponse.java b/v2/src/main/java/com/skyflow/vault/data/UpdateResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/data/UpdateResponse.java rename to v2/src/main/java/com/skyflow/vault/data/UpdateResponse.java diff --git a/src/main/java/com/skyflow/vault/detect/AudioBleep.java b/v2/src/main/java/com/skyflow/vault/detect/AudioBleep.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/AudioBleep.java rename to v2/src/main/java/com/skyflow/vault/detect/AudioBleep.java diff --git a/src/main/java/com/skyflow/vault/detect/DateTransformation.java b/v2/src/main/java/com/skyflow/vault/detect/DateTransformation.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/DateTransformation.java rename to v2/src/main/java/com/skyflow/vault/detect/DateTransformation.java diff --git a/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java b/v2/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java rename to v2/src/main/java/com/skyflow/vault/detect/DeidentifyFileRequest.java diff --git a/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java b/v2/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java rename to v2/src/main/java/com/skyflow/vault/detect/DeidentifyFileResponse.java diff --git a/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java b/v2/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java rename to v2/src/main/java/com/skyflow/vault/detect/DeidentifyTextRequest.java diff --git a/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java b/v2/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java rename to v2/src/main/java/com/skyflow/vault/detect/DeidentifyTextResponse.java diff --git a/src/main/java/com/skyflow/vault/detect/EntityInfo.java b/v2/src/main/java/com/skyflow/vault/detect/EntityInfo.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/EntityInfo.java rename to v2/src/main/java/com/skyflow/vault/detect/EntityInfo.java diff --git a/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java b/v2/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/FileEntityInfo.java rename to v2/src/main/java/com/skyflow/vault/detect/FileEntityInfo.java diff --git a/src/main/java/com/skyflow/vault/detect/FileInfo.java b/v2/src/main/java/com/skyflow/vault/detect/FileInfo.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/FileInfo.java rename to v2/src/main/java/com/skyflow/vault/detect/FileInfo.java diff --git a/src/main/java/com/skyflow/vault/detect/FileInput.java b/v2/src/main/java/com/skyflow/vault/detect/FileInput.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/FileInput.java rename to v2/src/main/java/com/skyflow/vault/detect/FileInput.java diff --git a/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java b/v2/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java rename to v2/src/main/java/com/skyflow/vault/detect/GetDetectRunRequest.java diff --git a/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java b/v2/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java rename to v2/src/main/java/com/skyflow/vault/detect/ReidentifyTextRequest.java diff --git a/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java b/v2/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java rename to v2/src/main/java/com/skyflow/vault/detect/ReidentifyTextResponse.java diff --git a/src/main/java/com/skyflow/vault/detect/TextIndex.java b/v2/src/main/java/com/skyflow/vault/detect/TextIndex.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/TextIndex.java rename to v2/src/main/java/com/skyflow/vault/detect/TextIndex.java diff --git a/src/main/java/com/skyflow/vault/detect/TokenFormat.java b/v2/src/main/java/com/skyflow/vault/detect/TokenFormat.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/TokenFormat.java rename to v2/src/main/java/com/skyflow/vault/detect/TokenFormat.java diff --git a/src/main/java/com/skyflow/vault/detect/Transformations.java b/v2/src/main/java/com/skyflow/vault/detect/Transformations.java similarity index 100% rename from src/main/java/com/skyflow/vault/detect/Transformations.java rename to v2/src/main/java/com/skyflow/vault/detect/Transformations.java diff --git a/src/main/java/com/skyflow/vault/tokens/ColumnValue.java b/v2/src/main/java/com/skyflow/vault/tokens/ColumnValue.java similarity index 100% rename from src/main/java/com/skyflow/vault/tokens/ColumnValue.java rename to v2/src/main/java/com/skyflow/vault/tokens/ColumnValue.java diff --git a/src/main/java/com/skyflow/vault/tokens/DetokenizeData.java b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeData.java similarity index 60% rename from src/main/java/com/skyflow/vault/tokens/DetokenizeData.java rename to v2/src/main/java/com/skyflow/vault/tokens/DetokenizeData.java index 0e1b6b63..0353aa6c 100644 --- a/src/main/java/com/skyflow/vault/tokens/DetokenizeData.java +++ b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeData.java @@ -1,23 +1,23 @@ package com.skyflow.vault.tokens; import com.skyflow.enums.RedactionType; +import com.skyflow.vault.data.BaseDetokenizeData; -public class DetokenizeData { - private final String token; +public class DetokenizeData extends BaseDetokenizeData { private final RedactionType redactionType; public DetokenizeData(String token) { - this.token = token; + super(token); this.redactionType = RedactionType.DEFAULT; } public DetokenizeData(String token, RedactionType redactionType) { - this.token = token; - this.redactionType = redactionType == null ? RedactionType.DEFAULT : redactionType; + super(token); + this.redactionType = redactionType == null ? RedactionType.DEFAULT : redactionType; } public String getToken() { - return this.token; + return super.getToken(); } public RedactionType getRedactionType() { diff --git a/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java similarity index 73% rename from src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java rename to v2/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java index 7d2ae73c..a16b17dd 100644 --- a/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java +++ b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeRecordResponse.java @@ -2,44 +2,29 @@ import com.skyflow.generated.rest.types.V1DetokenizeRecordResponse; +import com.skyflow.vault.data.BaseDetokenizeRecordResponse; -public class DetokenizeRecordResponse { - private final String token; - private final String value; +public class DetokenizeRecordResponse extends BaseDetokenizeRecordResponse { private final String type; - private final String error; private final String requestId; + private final String value; public DetokenizeRecordResponse(V1DetokenizeRecordResponse record) { this(record, null); } public DetokenizeRecordResponse(V1DetokenizeRecordResponse record, String requestId) { - this.token = record.getToken().orElse(null); - + super(record.getToken().orElse(null), record.getError().orElse(null)); this.value = record.getValue() .filter(val -> val != null && !val.toString().isEmpty()) .orElse(null); - this.type = record.getValueType() .map(Enum::toString) .filter(val -> !"NONE".equals(val)) .orElse(null); - this.error = record.getError().orElse(null); - this.requestId = requestId; } - - - public String getError() { - return error; - } - - public String getToken() { - return token; - } - public String getValue() { return value; } diff --git a/src/main/java/com/skyflow/vault/tokens/DetokenizeRequest.java b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/tokens/DetokenizeRequest.java rename to v2/src/main/java/com/skyflow/vault/tokens/DetokenizeRequest.java diff --git a/src/main/java/com/skyflow/vault/tokens/DetokenizeResponse.java b/v2/src/main/java/com/skyflow/vault/tokens/DetokenizeResponse.java similarity index 100% rename from src/main/java/com/skyflow/vault/tokens/DetokenizeResponse.java rename to v2/src/main/java/com/skyflow/vault/tokens/DetokenizeResponse.java diff --git a/src/main/java/com/skyflow/vault/tokens/TokenizeRequest.java b/v2/src/main/java/com/skyflow/vault/tokens/TokenizeRequest.java similarity index 100% rename from src/main/java/com/skyflow/vault/tokens/TokenizeRequest.java rename to v2/src/main/java/com/skyflow/vault/tokens/TokenizeRequest.java diff --git a/src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java b/v2/src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java similarity index 85% rename from src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java rename to v2/src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java index d8d8072b..c77787cf 100644 --- a/src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java +++ b/v2/src/main/java/com/skyflow/vault/tokens/TokenizeResponse.java @@ -1,9 +1,13 @@ package com.skyflow.vault.tokens; -import com.google.gson.*; - import java.util.List; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + public class TokenizeResponse { private final List tokens; diff --git a/src/main/resources/sdk.properties b/v2/src/main/resources/sdk.properties similarity index 100% rename from src/main/resources/sdk.properties rename to v2/src/main/resources/sdk.properties diff --git a/src/test/java/com/skyflow/ConnectionClientDotenvTests.java b/v2/src/test/java/com/skyflow/ConnectionClientDotenvTests.java similarity index 100% rename from src/test/java/com/skyflow/ConnectionClientDotenvTests.java rename to v2/src/test/java/com/skyflow/ConnectionClientDotenvTests.java diff --git a/src/test/java/com/skyflow/ConnectionClientTests.java b/v2/src/test/java/com/skyflow/ConnectionClientTests.java similarity index 100% rename from src/test/java/com/skyflow/ConnectionClientTests.java rename to v2/src/test/java/com/skyflow/ConnectionClientTests.java diff --git a/src/test/java/com/skyflow/SkyflowTests.java b/v2/src/test/java/com/skyflow/SkyflowTests.java similarity index 62% rename from src/test/java/com/skyflow/SkyflowTests.java rename to v2/src/test/java/com/skyflow/SkyflowTests.java index 983419a7..07386a5b 100644 --- a/src/test/java/com/skyflow/SkyflowTests.java +++ b/v2/src/test/java/com/skyflow/SkyflowTests.java @@ -1,8 +1,9 @@ package com.skyflow; -import com.skyflow.config.ConnectionConfig; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.config.ConnectionConfig; +import com.skyflow.config.VaultConfig; import com.skyflow.enums.Env; import com.skyflow.enums.LogLevel; import com.skyflow.errors.ErrorCode; @@ -102,55 +103,6 @@ public void testAddingValidVaultConfigInSkyflowClient() { } } - @Test - public void testAddingExistingVaultConfigInSkyflowClient() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.SANDBOX); - Skyflow skyflowClient = Skyflow.builder().build(); - skyflowClient.addVaultConfig(config).addVaultConfig(config); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdAlreadyInConfigList.getMessage(), e.getMessage()); - } - } - - @Test - public void testUpdatingNonExistentVaultConfigInSkyflowBuilder() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.SANDBOX); - Skyflow.builder().updateVaultConfig(config).build(); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - - @Test - public void testUpdatingNonExistentVaultConfigInSkyflowClient() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.SANDBOX); - Skyflow skyflowClient = Skyflow.builder().build(); - skyflowClient.updateVaultConfig(config); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } catch (Exception e) { - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - @Test public void testUpdatingValidVaultConfigInSkyflowClient() { try { @@ -173,114 +125,6 @@ public void testUpdatingValidVaultConfigInSkyflowClient() { } } - @Test - public void testUpdateVaultConfigNullCredentialsFallsBackToPrevious() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.SANDBOX); - - Credentials creds = new Credentials(); - creds.setToken(token); - config.setCredentials(creds); - - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(config).build(); - - // Update with null credentials — should retain previous credentials value - VaultConfig partialUpdate = new VaultConfig(); - partialUpdate.setVaultId(vaultID); - partialUpdate.setClusterId(clusterID); - skyflowClient.updateVaultConfig(partialUpdate); - Assert.assertNotNull(skyflowClient.getVaultConfig(vaultID).getCredentials()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testRemovingNonExistentVaultConfigInSkyflowBuilder() { - try { - Skyflow.builder().removeVaultConfig(vaultID).build(); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - - @Test - public void testRemovingNonExistentVaultConfigInSkyflowClient() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.SANDBOX); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(config).build(); - skyflowClient.removeVaultConfig(vaultID); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testRemovingValidVaultConfigInSkyflowClient() { - try { - Skyflow skyflowClient = Skyflow.builder().build(); - skyflowClient.removeVaultConfig(vaultID); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - - @Test - public void testGettingNonExistentVaultConfigInSkyflowClient() { - try { - Skyflow skyflowClient = Skyflow.builder().build(); - VaultConfig config = skyflowClient.getVaultConfig(vaultID); - Assert.assertNull(config); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testGettingAlreadyRemovedVaultFromEmptyConfigs() { - try { - Skyflow skyflowClient = Skyflow.builder().build(); - skyflowClient.vault(); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - - @Test - public void testGettingAlreadyRemovedVaultFromNonEmptyConfigs() { - try { - VaultConfig primaryConfig = new VaultConfig(); - primaryConfig.setVaultId(vaultID); - primaryConfig.setClusterId(clusterID); - primaryConfig.setEnv(Env.SANDBOX); - - VaultConfig secondaryConfig = new VaultConfig(); - secondaryConfig.setVaultId(vaultID + "123"); - secondaryConfig.setClusterId(clusterID); - secondaryConfig.setEnv(Env.SANDBOX); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(primaryConfig).addVaultConfig(secondaryConfig).build(); - skyflowClient.removeVaultConfig(vaultID); - skyflowClient.vault(vaultID); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.VaultIdNotInConfigList.getMessage(), e.getMessage()); - } - } - - @Test public void testAddingInvalidConnectionConfigInSkyflowBuilder() { try { @@ -460,60 +304,6 @@ public void testGettingNonExistentConnectionConfigInSkyflowClient() { } } - @Test - public void testAddingInvalidSkyflowCredentialsInSkyflowBuilder() { - try { - Credentials credentials = new Credentials(); - Skyflow.builder().addSkyflowCredentials(credentials).build(); - Assert.fail(EXCEPTION_NOT_THROWN); - } catch (SkyflowException e) { - Assert.assertEquals(ErrorCode.INVALID_INPUT.getCode(), e.getHttpCode()); - Assert.assertEquals(ErrorMessage.NoTokenGenerationMeansPassed.getMessage(), e.getMessage()); - } - } - - @Test - public void testUpdatingValidSkyflowCredentialsInSkyflowClient() { - try { - VaultConfig vaultConfig = new VaultConfig(); - vaultConfig.setVaultId(vaultID); - vaultConfig.setClusterId(clusterID); - - ConnectionConfig connectionConfig = new ConnectionConfig(); - connectionConfig.setConnectionId(connectionID); - connectionConfig.setConnectionUrl(connectionURL); - - Credentials credentials = new Credentials(); - credentials.setToken(token); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(vaultConfig).addConnectionConfig(connectionConfig).build(); - skyflowClient.updateSkyflowCredentials(credentials); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testDefaultLogLevel() { - try { - Skyflow skyflowClient = Skyflow.builder().setLogLevel(null).build(); - Assert.assertEquals(LogLevel.ERROR, skyflowClient.getLogLevel()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testSetLogLevel() { - try { - Skyflow skyflowClient = Skyflow.builder().setLogLevel(LogLevel.INFO).build(); - Assert.assertEquals(LogLevel.INFO, skyflowClient.getLogLevel()); - skyflowClient.setLogLevel(LogLevel.WARN); - Assert.assertEquals(LogLevel.WARN, skyflowClient.getLogLevel()); - } catch (Exception e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - @Test @SuppressWarnings("deprecation") public void testUpdateLogLevel() { @@ -686,36 +476,6 @@ public void testDetectMethodWithInvalidVaultId() { } } - @Test - public void testUpdateVaultConfig_withNewClusterIdAndCredentials_updatesAllFields() { - try { - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(Env.DEV); - Credentials creds = new Credentials(); - creds.setToken(token); - config.setCredentials(creds); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(config).build(); - - // Update with a new non-null clusterId and new non-null credentials — covers - // the non-null (true) branches for all three ternaries in findAndUpdateVaultConfig - Credentials newCreds = new Credentials(); - newCreds.setToken("updated-token-value"); - VaultConfig update = new VaultConfig(); - update.setVaultId(vaultID); - update.setClusterId(newClusterID); - update.setEnv(Env.PROD); - update.setCredentials(newCreds); - skyflowClient.updateVaultConfig(update); - Assert.assertEquals(newClusterID, skyflowClient.getVaultConfig(vaultID).getClusterId()); - Assert.assertEquals(Env.PROD, skyflowClient.getVaultConfig(vaultID).getEnv()); - Assert.assertEquals("updated-token-value", skyflowClient.getVaultConfig(vaultID).getCredentials().getToken()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - @Test public void testUpdateConnectionConfig_withNewCredentials_updatesCredentials() { try { @@ -743,75 +503,6 @@ public void testUpdateConnectionConfig_withNewCredentials_updatesCredentials() { } } - @Test - public void testUpdateVaultConfig_withNullEnv_fallsBackToPreviousEnv() { - // VaultConfig's constructor defaults env=PROD so getEnv() is never null via normal API. - // Use an anonymous subclass to make getEnv() return null, exercising the false branch - // of `vaultConfig.getEnv() != null` in findAndUpdateVaultConfig. - try { - Credentials creds = new Credentials(); - creds.setToken(token); - VaultConfig initial = new VaultConfig(); - initial.setVaultId(vaultID); - initial.setClusterId(clusterID); - initial.setEnv(Env.SANDBOX); - initial.setCredentials(creds); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(initial).build(); - - VaultConfig updateWithNullEnv = new VaultConfig() { - @Override public Env getEnv() { return null; } - }; - updateWithNullEnv.setVaultId(vaultID); - updateWithNullEnv.setClusterId(clusterID); - updateWithNullEnv.setCredentials(creds); - - skyflowClient.updateVaultConfig(updateWithNullEnv); - // env falls back to previous (SANDBOX) - Assert.assertEquals(Env.SANDBOX, skyflowClient.getVaultConfig(vaultID).getEnv()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } - } - - @Test - public void testFindAndUpdateVaultConfig_withNullClusterId_fallsBackToPreviousClusterId() { - // Validation enforces non-null clusterId, so the false branch of - // `vaultConfig.getClusterId() != null` in findAndUpdateVaultConfig is unreachable - // via the normal flow. Call the private method directly via reflection. - try { - Credentials creds = new Credentials(); - creds.setToken(token); - VaultConfig initial = new VaultConfig(); - initial.setVaultId(vaultID); - initial.setClusterId(clusterID); - initial.setEnv(Env.DEV); - initial.setCredentials(creds); - Skyflow skyflowClient = Skyflow.builder().addVaultConfig(initial).build(); - - java.lang.reflect.Field builderField = Skyflow.class.getDeclaredField("builder"); - builderField.setAccessible(true); - Object builder = builderField.get(skyflowClient); - - VaultConfig nullClusterConfig = new VaultConfig(); - nullClusterConfig.setVaultId(vaultID); - // Override clusterId field to null via reflection (setter enforces non-null) - java.lang.reflect.Field clusterIdField = VaultConfig.class.getDeclaredField("clusterId"); - clusterIdField.setAccessible(true); - clusterIdField.set(nullClusterConfig, null); - - java.lang.reflect.Method method = builder.getClass().getDeclaredMethod( - "findAndUpdateVaultConfig", VaultConfig.class); - method.setAccessible(true); - VaultConfig result = (VaultConfig) method.invoke(builder, nullClusterConfig); - - Assert.assertEquals(clusterID, result.getClusterId()); - } catch (SkyflowException e) { - Assert.fail(INVALID_EXCEPTION_THROWN); - } catch (Exception e) { - Assert.fail("Reflection failed: " + e.getMessage()); - } - } - @Test public void testFindAndUpdateConnectionConfig_withNullConnectionUrl_fallsBackToPreviousUrl() { // `findAndUpdateConnectionConfig` has a ternary for connectionUrl that falls back diff --git a/src/test/java/com/skyflow/VaultClientTests.java b/v2/src/test/java/com/skyflow/VaultClientTests.java similarity index 90% rename from src/test/java/com/skyflow/VaultClientTests.java rename to v2/src/test/java/com/skyflow/VaultClientTests.java index d98f5964..4c040ad0 100644 --- a/src/test/java/com/skyflow/VaultClientTests.java +++ b/v2/src/test/java/com/skyflow/VaultClientTests.java @@ -1,12 +1,15 @@ package com.skyflow; +import com.skyflow.config.VaultConfig; +import com.skyflow.config.BaseCredentials; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.enums.*; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.SkyflowException; -import com.skyflow.generated.rest.resources.files.FilesClient; import com.skyflow.generated.rest.resources.files.requests.*; +import com.skyflow.generated.rest.resources.files.FilesClient; +import com.skyflow.generated.rest.types.*; import com.skyflow.generated.rest.resources.query.QueryClient; import com.skyflow.generated.rest.resources.records.RecordsClient; import com.skyflow.generated.rest.resources.records.requests.RecordServiceBatchOperationBody; @@ -18,7 +21,6 @@ import com.skyflow.generated.rest.resources.tokens.TokensClient; import com.skyflow.generated.rest.resources.tokens.requests.V1DetokenizePayload; import com.skyflow.generated.rest.resources.tokens.requests.V1TokenizePayload; -import com.skyflow.generated.rest.types.*; import com.skyflow.vault.data.InsertRequest; import com.skyflow.vault.data.UpdateRequest; import com.skyflow.vault.detect.*; @@ -707,7 +709,7 @@ public void testGetDeidentifyTextFileRequest() { String vaultId = "vault123"; String base64Content = "base64string"; - com.skyflow.generated.rest.resources.files.requests.DeidentifyFileRequestDeidentifyText textRequest = + DeidentifyFileRequestDeidentifyText textRequest = vaultClient.getDeidentifyTextFileRequest(request, vaultId, base64Content); Assert.assertEquals(vaultId, textRequest.getVaultId()); @@ -899,44 +901,16 @@ public void testMapAudioDataFormat_invalid() throws Exception { } } - @Test - public void testPrioritiseCredentials_VaultConfigCredentials() throws Exception { - Credentials creds = new Credentials(); - creds.setApiKey("test_api_key"); - vaultConfig.setCredentials(creds); - - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("prioritiseCredentials"); - method.setAccessible(true); - method.invoke(vaultClient); - - Assert.assertEquals(creds, getPrivateField(vaultClient, "finalCredentials")); - } - - @Test - public void testPrioritiseCredentials_CommonCredentials() throws Exception { - vaultConfig.setCredentials(null); - Credentials creds = new Credentials(); - creds.setApiKey("common_api_key"); - setPrivateField(vaultClient, "commonCredentials", creds); - - java.lang.reflect.Method method = VaultClient.class.getDeclaredMethod("prioritiseCredentials"); - method.setAccessible(true); - method.invoke(vaultClient); - - Assert.assertEquals(creds, getPrivateField(vaultClient, "finalCredentials")); - } - - // Helper methods for reflection field access - private Object getPrivateField(Object obj, String fieldName) throws Exception { - java.lang.reflect.Field field = obj.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - return field.get(obj); - } - - private void setPrivateField(Object obj, String fieldName, Object value) throws Exception { - java.lang.reflect.Field field = obj.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(obj, value); + // Fields moved to base classes (e.g. common.BaseVaultClient) aren't found by + // getDeclaredField on the subclass, so walk up the hierarchy. + private java.lang.reflect.Field findDeclaredField(Class clazz, String fieldName) throws NoSuchFieldException { + for (Class current = clazz; current != null; current = current.getSuperclass()) { + try { + return current.getDeclaredField(fieldName); + } catch (NoSuchFieldException ignored) { + } + } + throw new NoSuchFieldException(fieldName); } @Test @@ -956,31 +930,6 @@ public void testGetFileForFileUpload_withFileObject() { } } - @Test - public void testSetBearerToken_validNonExpiredToken_reusesToken() { - try { - // far-future JWT: header.payload.sig where payload base64 decodes to {"exp":9999999999} - Credentials creds = new Credentials(); - creds.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); - VaultConfig config = new VaultConfig(); - config.setVaultId(vaultID); - config.setClusterId(clusterID); - config.setEnv(com.skyflow.enums.Env.DEV); - config.setCredentials(creds); - VaultClient freshClient = new VaultClient(config, null); - - // First call: token=null → generates from creds.getToken() - freshClient.setBearerToken(); - Assert.assertEquals("x.eyJleHAiOjk5OTk5OTk5OTl9.y", getPrivateField(freshClient, "token")); - - // Second call: token valid, not expired → REUSE_BEARER_TOKEN else branch - freshClient.setBearerToken(); - Assert.assertEquals("x.eyJleHAiOjk5OTk5OTk5OTl9.y", getPrivateField(freshClient, "token")); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - @Test public void testGetDeidentifyImageRequest_withMaskingMethod() { try { @@ -1042,52 +991,6 @@ public void testGetDeIdentifyTextResponse_withEntityScores() { Assert.assertEquals(0.95, result.getEntities().get(0).getScores().get("EMAIL_ADDRESS"), 0.001); } - @Test - public void testPrioritiseCredentials_credentialChange_resetsTokenAndApiKey() { - try { - Credentials credentialsA = new Credentials(); - credentialsA.setToken("x.eyJleHAiOjk5OTk5OTk5OTl9.y"); - VaultConfig config = new VaultConfig(); - config.setVaultId("isolated-vault-change"); - config.setClusterId(clusterID); - config.setEnv(com.skyflow.enums.Env.DEV); - config.setCredentials(credentialsA); - VaultClient freshClient = new VaultClient(config, null); - - freshClient.updateVaultConfig(); // sets finalCredentials = credentialsA - setPrivateField(freshClient, "token", "cached-token"); // simulate prior auth - - Credentials credentialsB = new Credentials(); - credentialsB.setToken("other-token"); - config.setCredentials(credentialsB); - - freshClient.updateVaultConfig(); // original=A, new=B → different → reset token/apiKey - Assert.assertNull(getPrivateField(freshClient, "token")); - Assert.assertNull(getPrivateField(freshClient, "apiKey")); - } catch (Exception e) { - Assert.fail("Should not have thrown: " + e.getMessage()); - } - } - - @Test - public void testSetBearerToken_noCredentials_throwsEmptyCredentials() { - VaultConfig config = new VaultConfig(); - config.setVaultId("isolated-vault-nocreds"); - config.setClusterId(clusterID); - config.setEnv(com.skyflow.enums.Env.DEV); - // No credentials — will hit dotenv path → DotenvException → SkyflowException(EmptyCredentials) - VaultClient freshClient = new VaultClient(config, null); - try { - freshClient.setBearerToken(); - Assert.fail("Should have thrown SkyflowException"); - } catch (SkyflowException e) { - // SkyflowException expected — message varies by environment - // (EmptyCredentials when no .env, or credential error when .env provides creds) - } catch (Exception e) { - Assert.fail("Expected SkyflowException, got: " + e.getClass().getName() + ": " + e.getMessage()); - } - } - @Test public void testUpdateExecutorInHTTP_interceptorAddsAuthorizationHeader() { try { @@ -1103,7 +1006,7 @@ public void testUpdateExecutorInHTTP_interceptorAddsAuthorizationHeader() { freshClient.setBearerToken(); // triggers updateExecutorInHTTP → creates sharedHttpClient with interceptor // Access sharedHttpClient via reflection - java.lang.reflect.Field field = VaultClient.class.getDeclaredField("sharedHttpClient"); + java.lang.reflect.Field field = findDeclaredField(VaultClient.class, "sharedHttpClient"); field.setAccessible(true); OkHttpClient httpClient = (OkHttpClient) field.get(freshClient); Assert.assertNotNull(httpClient); diff --git a/src/test/java/com/skyflow/config/ConnectionConfigTests.java b/v2/src/test/java/com/skyflow/config/ConnectionConfigTests.java similarity index 100% rename from src/test/java/com/skyflow/config/ConnectionConfigTests.java rename to v2/src/test/java/com/skyflow/config/ConnectionConfigTests.java diff --git a/src/test/java/com/skyflow/config/ManagementConfigTest.java b/v2/src/test/java/com/skyflow/config/ManagementConfigTest.java similarity index 100% rename from src/test/java/com/skyflow/config/ManagementConfigTest.java rename to v2/src/test/java/com/skyflow/config/ManagementConfigTest.java diff --git a/src/test/java/com/skyflow/config/VaultConfigTests.java b/v2/src/test/java/com/skyflow/config/VaultConfigTests.java similarity index 100% rename from src/test/java/com/skyflow/config/VaultConfigTests.java rename to v2/src/test/java/com/skyflow/config/VaultConfigTests.java diff --git a/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java b/v2/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java similarity index 100% rename from src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java rename to v2/src/test/java/com/skyflow/enums/DeidentifyFileStatusTest.java diff --git a/src/test/java/com/skyflow/enums/DetectEntitiesTest.java b/v2/src/test/java/com/skyflow/enums/DetectEntitiesTest.java similarity index 100% rename from src/test/java/com/skyflow/enums/DetectEntitiesTest.java rename to v2/src/test/java/com/skyflow/enums/DetectEntitiesTest.java diff --git a/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java b/v2/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java similarity index 100% rename from src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java rename to v2/src/test/java/com/skyflow/enums/DetectOutputTranscriptionsTest.java diff --git a/src/test/java/com/skyflow/enums/MaskingMethodTest.java b/v2/src/test/java/com/skyflow/enums/MaskingMethodTest.java similarity index 100% rename from src/test/java/com/skyflow/enums/MaskingMethodTest.java rename to v2/src/test/java/com/skyflow/enums/MaskingMethodTest.java diff --git a/src/test/java/com/skyflow/enums/TokenModeTest.java b/v2/src/test/java/com/skyflow/enums/TokenModeTest.java similarity index 98% rename from src/test/java/com/skyflow/enums/TokenModeTest.java rename to v2/src/test/java/com/skyflow/enums/TokenModeTest.java index 72236a16..b65a72cb 100644 --- a/src/test/java/com/skyflow/enums/TokenModeTest.java +++ b/v2/src/test/java/com/skyflow/enums/TokenModeTest.java @@ -1,6 +1,5 @@ package com.skyflow.enums; -import com.skyflow.enums.LogLevel; import com.skyflow.generated.rest.types.V1Byot; import com.skyflow.logs.InfoLogs; import com.skyflow.utils.logger.LogUtil; diff --git a/src/test/java/com/skyflow/enums/TokenTypeTest.java b/v2/src/test/java/com/skyflow/enums/TokenTypeTest.java similarity index 100% rename from src/test/java/com/skyflow/enums/TokenTypeTest.java rename to v2/src/test/java/com/skyflow/enums/TokenTypeTest.java diff --git a/src/test/java/com/skyflow/utils/HttpUtilityTests.java b/v2/src/test/java/com/skyflow/utils/HttpUtilityTests.java similarity index 100% rename from src/test/java/com/skyflow/utils/HttpUtilityTests.java rename to v2/src/test/java/com/skyflow/utils/HttpUtilityTests.java diff --git a/v2/src/test/java/com/skyflow/utils/UtilsTests.java b/v2/src/test/java/com/skyflow/utils/UtilsTests.java new file mode 100644 index 00000000..d1e1c725 --- /dev/null +++ b/v2/src/test/java/com/skyflow/utils/UtilsTests.java @@ -0,0 +1,94 @@ +package com.skyflow.utils; + +import com.google.gson.JsonObject; +import com.skyflow.config.ConnectionConfig; +import com.skyflow.enums.RequestMethod; +import com.skyflow.vault.connection.InvokeConnectionRequest; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +public class UtilsTests { + private static final String INVALID_EXCEPTION_THROWN = "Should not have thrown any exception"; + private static String connectionId = null; + private static String connectionUrl = null; + private static Map queryParams; + private static Map pathParams; + private static Map requestHeaders; + + @BeforeClass + public static void setup() { + connectionId = "test_connection_id"; + connectionUrl = "https://test.connection.url"; + pathParams = new HashMap<>(); + queryParams = new HashMap<>(); + requestHeaders = new HashMap<>(); + } + + @Test + public void testConstructConnectionURL() { + try { + queryParams.put("query_param", "value"); + pathParams.put("path_param", "value"); + + ConnectionConfig connectionConfig = new ConnectionConfig(); + connectionConfig.setConnectionId(connectionId); + connectionConfig.setConnectionUrl(connectionUrl); + + InvokeConnectionRequest request = InvokeConnectionRequest.builder() + .method(RequestMethod.POST).pathParams(pathParams).queryParams(queryParams).build(); + String filledUrl = Utils.constructConnectionURL(connectionConfig, request); + Assert.assertEquals(connectionUrl + "?" + "query_param=value", filledUrl); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testConstructConnectionHeaderMap() { + try { + requestHeaders.put("HEADER", "value"); + Map headers = Utils.constructConnectionHeadersMap(requestHeaders); + Assert.assertEquals(1, headers.size()); + Assert.assertTrue(headers.containsKey("header")); + Assert.assertFalse(headers.containsKey("HEADER")); + Assert.assertEquals("value", headers.get("header")); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetMetrics() { + try { + JsonObject metrics = Utils.getMetrics(); + Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_NAME_VERSION)); + Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_CLIENT_DEVICE_MODEL)); + Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS)); + Assert.assertNotNull(metrics.get(Constants.SDK_METRIC_RUNTIME_DETAILS)); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } + + @Test + public void testGetMetricsWithException() { + try { + // Clearing System Properties explicitly to throw exception + System.clearProperty("os.name"); + System.clearProperty("os.version"); + System.clearProperty("java.version"); + + JsonObject metrics = Utils.getMetrics(); + Assert.assertEquals("skyflow-java@" + Constants.SDK_VERSION, metrics.get(Constants.SDK_METRIC_NAME_VERSION).getAsString()); + Assert.assertEquals("Java@", metrics.get(Constants.SDK_METRIC_RUNTIME_DETAILS).getAsString()); + Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_DEVICE_MODEL).getAsString().isEmpty()); + Assert.assertTrue(metrics.get(Constants.SDK_METRIC_CLIENT_OS_DETAILS).getAsString().isEmpty()); + } catch (Exception e) { + Assert.fail(INVALID_EXCEPTION_THROWN); + } + } +} diff --git a/src/test/java/com/skyflow/vault/BinAuditTests.java b/v2/src/test/java/com/skyflow/vault/BinAuditTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/BinAuditTests.java rename to v2/src/test/java/com/skyflow/vault/BinAuditTests.java diff --git a/src/test/java/com/skyflow/vault/connection/InvokeConnectionTests.java b/v2/src/test/java/com/skyflow/vault/connection/InvokeConnectionTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/connection/InvokeConnectionTests.java rename to v2/src/test/java/com/skyflow/vault/connection/InvokeConnectionTests.java diff --git a/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java b/v2/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java rename to v2/src/test/java/com/skyflow/vault/controller/ConnectionControllerTests.java diff --git a/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java b/v2/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java similarity index 99% rename from src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java rename to v2/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java index 2b8379bc..f0347eeb 100644 --- a/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java +++ b/v2/src/test/java/com/skyflow/vault/controller/DetectControllerFileTests.java @@ -1,5 +1,6 @@ package com.skyflow.vault.controller; +import com.skyflow.config.BaseVaultConfig; import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; import com.skyflow.errors.ErrorCode; diff --git a/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java b/v2/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/controller/DetectControllerTests.java rename to v2/src/test/java/com/skyflow/vault/controller/DetectControllerTests.java diff --git a/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java b/v2/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/controller/VaultControllerTests.java rename to v2/src/test/java/com/skyflow/vault/controller/VaultControllerTests.java diff --git a/src/test/java/com/skyflow/vault/data/DeleteTests.java b/v2/src/test/java/com/skyflow/vault/data/DeleteTests.java similarity index 98% rename from src/test/java/com/skyflow/vault/data/DeleteTests.java rename to v2/src/test/java/com/skyflow/vault/data/DeleteTests.java index befc3d26..ae294f24 100644 --- a/src/test/java/com/skyflow/vault/data/DeleteTests.java +++ b/v2/src/test/java/com/skyflow/vault/data/DeleteTests.java @@ -1,8 +1,8 @@ package com.skyflow.vault.data; import com.skyflow.Skyflow; +import com.skyflow.config.BaseVaultConfig; import com.skyflow.config.Credentials; -import com.skyflow.config.VaultConfig; import com.skyflow.enums.Env; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; @@ -35,7 +35,7 @@ public static void setup() { Credentials credentials = new Credentials(); credentials.setToken("valid-token"); - VaultConfig vaultConfig = new VaultConfig(); + BaseVaultConfig vaultConfig = new BaseVaultConfig(); vaultConfig.setVaultId(vaultID); vaultConfig.setClusterId(clusterID); vaultConfig.setEnv(Env.DEV); diff --git a/src/test/java/com/skyflow/vault/data/FileUploadTests.java b/v2/src/test/java/com/skyflow/vault/data/FileUploadTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/FileUploadTests.java rename to v2/src/test/java/com/skyflow/vault/data/FileUploadTests.java diff --git a/src/test/java/com/skyflow/vault/data/GetTests.java b/v2/src/test/java/com/skyflow/vault/data/GetTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/GetTests.java rename to v2/src/test/java/com/skyflow/vault/data/GetTests.java index e62c605f..bc6f24ef 100644 --- a/src/test/java/com/skyflow/vault/data/GetTests.java +++ b/v2/src/test/java/com/skyflow/vault/data/GetTests.java @@ -1,8 +1,8 @@ package com.skyflow.vault.data; import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.config.Credentials; import com.skyflow.enums.Env; import com.skyflow.enums.RedactionType; import com.skyflow.errors.ErrorCode; diff --git a/src/test/java/com/skyflow/vault/data/InsertTests.java b/v2/src/test/java/com/skyflow/vault/data/InsertTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/InsertTests.java rename to v2/src/test/java/com/skyflow/vault/data/InsertTests.java index 030bc5ea..0ba6c7f8 100644 --- a/src/test/java/com/skyflow/vault/data/InsertTests.java +++ b/v2/src/test/java/com/skyflow/vault/data/InsertTests.java @@ -1,8 +1,8 @@ package com.skyflow.vault.data; import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.config.Credentials; import com.skyflow.enums.Env; import com.skyflow.enums.TokenMode; import com.skyflow.errors.ErrorCode; diff --git a/src/test/java/com/skyflow/vault/data/QueryResponseTest.java b/v2/src/test/java/com/skyflow/vault/data/QueryResponseTest.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/QueryResponseTest.java rename to v2/src/test/java/com/skyflow/vault/data/QueryResponseTest.java diff --git a/src/test/java/com/skyflow/vault/data/QueryTests.java b/v2/src/test/java/com/skyflow/vault/data/QueryTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/QueryTests.java rename to v2/src/test/java/com/skyflow/vault/data/QueryTests.java diff --git a/src/test/java/com/skyflow/vault/data/UpdateTests.java b/v2/src/test/java/com/skyflow/vault/data/UpdateTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/data/UpdateTests.java rename to v2/src/test/java/com/skyflow/vault/data/UpdateTests.java index 8ae1db8d..ca334976 100644 --- a/src/test/java/com/skyflow/vault/data/UpdateTests.java +++ b/v2/src/test/java/com/skyflow/vault/data/UpdateTests.java @@ -1,8 +1,8 @@ package com.skyflow.vault.data; import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.config.Credentials; import com.skyflow.enums.Env; import com.skyflow.enums.TokenMode; import com.skyflow.errors.ErrorCode; diff --git a/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java b/v2/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java rename to v2/src/test/java/com/skyflow/vault/detect/DeidentifyFileRequestTest.java diff --git a/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java b/v2/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java rename to v2/src/test/java/com/skyflow/vault/detect/DeidentifyFileResponseTest.java diff --git a/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java b/v2/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java rename to v2/src/test/java/com/skyflow/vault/detect/DeidentifyTextTests.java diff --git a/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java b/v2/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java rename to v2/src/test/java/com/skyflow/vault/detect/FileEntityInfoTest.java diff --git a/src/test/java/com/skyflow/vault/detect/FileInfoTest.java b/v2/src/test/java/com/skyflow/vault/detect/FileInfoTest.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/FileInfoTest.java rename to v2/src/test/java/com/skyflow/vault/detect/FileInfoTest.java diff --git a/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java b/v2/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java rename to v2/src/test/java/com/skyflow/vault/detect/ReidentifyTextTests.java diff --git a/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java b/v2/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java rename to v2/src/test/java/com/skyflow/vault/tokens/DetokenizeTests.java diff --git a/src/test/java/com/skyflow/vault/tokens/TokenizeTests.java b/v2/src/test/java/com/skyflow/vault/tokens/TokenizeTests.java similarity index 100% rename from src/test/java/com/skyflow/vault/tokens/TokenizeTests.java rename to v2/src/test/java/com/skyflow/vault/tokens/TokenizeTests.java index 4c279fde..27563a57 100644 --- a/src/test/java/com/skyflow/vault/tokens/TokenizeTests.java +++ b/v2/src/test/java/com/skyflow/vault/tokens/TokenizeTests.java @@ -1,8 +1,8 @@ package com.skyflow.vault.tokens; import com.skyflow.Skyflow; -import com.skyflow.config.Credentials; import com.skyflow.config.VaultConfig; +import com.skyflow.config.Credentials; import com.skyflow.enums.Env; import com.skyflow.errors.ErrorCode; import com.skyflow.errors.ErrorMessage; diff --git a/v2/src/test/resources/notJson.txt b/v2/src/test/resources/notJson.txt new file mode 100644 index 00000000..bdf08de0 --- /dev/null +++ b/v2/src/test/resources/notJson.txt @@ -0,0 +1 @@ +test file \ No newline at end of file