aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/service
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/juick/service')
-rw-r--r--src/main/java/com/juick/service/PatreonService.java92
1 files changed, 92 insertions, 0 deletions
diff --git a/src/main/java/com/juick/service/PatreonService.java b/src/main/java/com/juick/service/PatreonService.java
new file mode 100644
index 00000000..fdd6d3dd
--- /dev/null
+++ b/src/main/java/com/juick/service/PatreonService.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2008-2023, Juick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.juick.service;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.util.UriComponentsBuilder;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.util.List;
+import java.util.stream.StreamSupport;
+
+@Component
+public class PatreonService {
+
+ @Inject
+ private OkHttpClient httpClient;
+ @Inject
+ private ObjectMapper jsonMapper;
+ @Value("${patreon_creator_access_token:secret}")
+ private String creatorAccessToken;
+
+ public List<String> fetchCampaigns() {
+ var resourceUri = UriComponentsBuilder.fromPath("/api/oauth2/v2/campaigns")
+ .host("www.patreon.com")
+ .scheme("https").build().toUriString();
+ var request = new Request.Builder()
+ .url(resourceUri)
+ .addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
+ .addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + creatorAccessToken)
+ .build();
+ try {
+ try (var response = httpClient.newCall(request).execute()) {
+ if (response.isSuccessful() && response.body() != null) {
+ var body = jsonMapper.readTree(response.body().string());
+ var data = body.get("data");
+ return StreamSupport.stream(data.spliterator(), false)
+ .map(campaign -> campaign.get("id").textValue())
+ .toList();
+ }
+ }
+ } catch (IOException e) {
+ return List.of();
+ }
+ return List.of();
+ }
+ public List<String> fetchPledges(String campaignId) {
+ var resourceUri = UriComponentsBuilder.fromPath(String.format("/api/oauth2/api/campaigns/%s/pledges?include=patron.null", campaignId))
+ .host("www.patreon.com")
+ .scheme("https").build().toUriString();
+ var request = new Request.Builder()
+ .url(resourceUri)
+ .addHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
+ .addHeader(HttpHeaders.AUTHORIZATION, "Bearer " + creatorAccessToken)
+ .build();
+ try {
+ try (var response = httpClient.newCall(request).execute()) {
+ if (response.isSuccessful() && response.body() != null) {
+ var body = jsonMapper.readTree(response.body().string());
+ var data = body.get("included");
+ return StreamSupport.stream(data.spliterator(), false)
+ .map(campaign -> campaign.get("attributes").get("email").textValue())
+ .toList();
+ }
+ }
+ } catch (IOException e) {
+ return List.of();
+ }
+ return List.of();
+ }
+}