diff options
Diffstat (limited to 'src/main/java/com/juick/service')
-rw-r--r-- | src/main/java/com/juick/service/PatreonService.java | 92 |
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(); + } +} |