This is an automated email from the ASF dual-hosted git repository.

turcsanyi pushed a commit to branch support/nifi-1.x
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/support/nifi-1.x by this push:
     new 22617ca1de NIFI-13798: Renamed Airtable's API Key property to Personal 
Access Token and updated docs due to API Keys deprecation
22617ca1de is described below

commit 22617ca1de31255d7b80451532468b07128658e4
Author: lehelb <[email protected]>
AuthorDate: Tue Oct 8 17:39:51 2024 -0500

    NIFI-13798: Renamed Airtable's API Key property to Personal Access Token 
and updated docs due to API Keys deprecation
    
    This closes #9364.
    
    Signed-off-by: Peter Turcsanyi <[email protected]>
---
 .../processors/airtable/QueryAirtableTable.java    | 13 +++---
 .../airtable/service/AirtableRestService.java      |  8 ++--
 .../additionalDetails.html                         |  8 ++--
 .../airtable/TestAirtableRestService.java          | 51 ++++++++++++++++++++++
 .../airtable/TestQueryAirtableTable.java           |  2 +-
 5 files changed, 68 insertions(+), 14 deletions(-)

diff --git 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
index f692a63a82..287bb17825 100644
--- 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
+++ 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/QueryAirtableTable.java
@@ -108,10 +108,11 @@ public class QueryAirtableTable extends AbstractProcessor 
{
             .required(true)
             .build();
 
-    static final PropertyDescriptor API_KEY = new PropertyDescriptor.Builder()
+    // API Keys are deprecated, Airtable now provides Personal Access Tokens 
instead.
+    static final PropertyDescriptor PAT = new PropertyDescriptor.Builder()
             .name("api-key")
-            .displayName("API Key")
-            .description("The REST API key to use in queries. Should be 
generated on Airtable's account page.")
+            .displayName("Personal Access Token")
+            .description("The Personal Access Token (PAT) to use in queries. 
Should be generated on Airtable's account page.")
             .required(true)
             .sensitive(true)
             .expressionLanguageSupported(ExpressionLanguageScope.NONE)
@@ -195,7 +196,7 @@ public class QueryAirtableTable extends AbstractProcessor {
 
     private static final List<PropertyDescriptor> PROPERTIES = 
Collections.unmodifiableList(Arrays.asList(
             API_URL,
-            API_KEY,
+            PAT,
             BASE_ID,
             TABLE_ID,
             FIELDS,
@@ -225,11 +226,11 @@ public class QueryAirtableTable extends AbstractProcessor 
{
     @OnScheduled
     public void onScheduled(final ProcessContext context) {
         final String apiUrl = 
context.getProperty(API_URL).evaluateAttributeExpressions().getValue();
-        final String apiKey = context.getProperty(API_KEY).getValue();
+        final String pat = context.getProperty(PAT).getValue();
         final String baseId = 
context.getProperty(BASE_ID).evaluateAttributeExpressions().getValue();
         final String tableId = 
context.getProperty(TABLE_ID).evaluateAttributeExpressions().getValue();
         final WebClientServiceProvider webClientServiceProvider = 
context.getProperty(WEB_CLIENT_SERVICE_PROVIDER).asControllerService(WebClientServiceProvider.class);
-        airtableRestService = new 
AirtableRestService(webClientServiceProvider, apiUrl, apiKey, baseId, tableId);
+        airtableRestService = new 
AirtableRestService(webClientServiceProvider, apiUrl, pat, baseId, tableId);
     }
 
     @Override
diff --git 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
index b3fb75577d..540c52fd9c 100644
--- 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
+++ 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/java/org/apache/nifi/processors/airtable/service/AirtableRestService.java
@@ -40,18 +40,18 @@ public class AirtableRestService {
 
     private final WebClientServiceProvider webClientServiceProvider;
     private final String apiUrl;
-    private final String apiKey;
+    private final String pat;
     private final String baseId;
     private final String tableId;
 
     public AirtableRestService(final WebClientServiceProvider 
webClientServiceProvider,
             final String apiUrl,
-            final String apiKey,
+            final String pat,
             final String baseId,
             final String tableId) {
         this.webClientServiceProvider = webClientServiceProvider;
         this.apiUrl = apiUrl;
-        this.apiKey = apiKey;
+        this.pat = pat;
         this.baseId = baseId;
         this.tableId = tableId;
     }
@@ -61,7 +61,7 @@ public class AirtableRestService {
         try (final HttpResponseEntity response = 
webClientServiceProvider.getWebClientService()
                 .get()
                 .uri(uri)
-                .header("Authorization", "Bearer " + apiKey)
+                .header("Authorization", "Bearer " + pat)
                 .retrieve()) {
 
             final InputStream bodyInputStream = response.body();
diff --git 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html
 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html
index 50086b57c2..9babc30796 100644
--- 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html
+++ 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/main/resources/docs/org.apache.nifi.processors.airtable.QueryAirtableTable/additionalDetails.html
@@ -41,9 +41,11 @@ td {text-align: left}
     It can also split large record sets to multiple FlowFiles just like a 
database processor.
 </p>
 
-<h3>API Key</h3>
+<h3>Personal Access Token</h3>
 <p>
-    Airtable REST API calls requires an API Key that needs to be passed in a 
request. An Airtable account is required to generate an API Key.
+    Please note that API Keys were deprecated, Airtable now provides Personal 
Access Tokens (PATs) instead.
+    Airtable REST API calls requires a PAT (Personal Access Token) that needs 
to be passed in a request. An Airtable account
+    is required to generate the PAT.
 </p>
 
 <h3>API rate limit</h3>
@@ -56,7 +58,7 @@ td {text-align: left}
 
 <h3>Metadata API</h3>
 <p>
-    Currently the Metadata API of Airtable is unstable, and we don't provide a 
way to use it.
+    Currently, the Metadata API of Airtable is unstable, and we don't provide 
a way to use it.
     Until it becomes stable you can set up a ConvertRecord or MergeRecord 
processor with a JsonTreeReader to read the content and convert it into a 
Record with schema.
 </p>
 </body>
diff --git 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
new file mode 100644
index 0000000000..591f9fa2e9
--- /dev/null
+++ 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestAirtableRestService.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.processors.airtable;
+
+import org.apache.nifi.processors.airtable.service.AirtableRestService;
+import org.apache.nifi.web.client.provider.api.WebClientServiceProvider;
+import 
org.apache.nifi.web.client.provider.service.StandardWebClientServiceProvider;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TestAirtableRestService {
+
+    private static final String API_URL_WITHOUT_SLASH = 
"https://api.airtable.com/v0";;
+    private static final String API_URL_WITH_SLASH = 
"https://api.airtable.com/v0/";;
+    private static final String PAT = "pat";
+    private static final String BASE_ID = "base-id";
+    private static final String TABLE_ID = "table-id";
+    private static final String EXPECTED_URL = String.format("%s/%s/%s", 
API_URL_WITHOUT_SLASH, BASE_ID, TABLE_ID);
+
+    private final WebClientServiceProvider webClientServiceProvider = new 
StandardWebClientServiceProvider();
+
+    @Test
+    void testApiUrlEndsWithoutSlash() {
+        AirtableRestService serviceWithoutSlash = new 
AirtableRestService(webClientServiceProvider, API_URL_WITHOUT_SLASH, PAT, 
BASE_ID, TABLE_ID);
+        String apiUrlWithSlash = 
serviceWithoutSlash.createUriBuilder().build().toString();
+        assertEquals(EXPECTED_URL, apiUrlWithSlash);
+    }
+
+    @Test
+    void testApiUrlEndsWithSlash() {
+        AirtableRestService serviceWithSlash = new 
AirtableRestService(webClientServiceProvider, API_URL_WITH_SLASH, PAT, BASE_ID, 
TABLE_ID);
+        String apiUrlWithSlash = 
serviceWithSlash.createUriBuilder().build().toString();
+        assertEquals(EXPECTED_URL, apiUrlWithSlash);
+    }
+}
+
diff --git 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
index dadd0cccb2..84473e2b4b 100644
--- 
a/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
+++ 
b/nifi-nar-bundles/nifi-airtable-bundle/nifi-airtable-processors/src/test/java/org/apache/nifi/processors/airtable/TestQueryAirtableTable.java
@@ -61,7 +61,7 @@ public class TestQueryAirtableTable {
         runner.addControllerService("webClientService", 
webClientServiceProvider);
         runner.enableControllerService(webClientServiceProvider);
 
-        runner.setProperty(QueryAirtableTable.API_KEY, "???");
+        runner.setProperty(QueryAirtableTable.PAT, "???");
         runner.setProperty(QueryAirtableTable.BASE_ID, "baseid");
         runner.setProperty(QueryAirtableTable.TABLE_ID, "tableid");
         runner.setProperty(QueryAirtableTable.WEB_CLIENT_SERVICE_PROVIDER, 
webClientServiceProvider.getIdentifier());

Reply via email to