From a50a32133de3616a678bc22f83157e6dcb9bdcb3 Mon Sep 17 00:00:00 2001 From: Serge Byishimo Date: Sun, 31 Mar 2024 20:48:54 +0200 Subject: [PATCH] fix: Bug fixes & Improvements - Meeds-io/MIPs#121 (#10) * fix: Selecting Project & Directories - Meeds-io/MIPs#121 * fix: Bug fixes & Improvements - Meeds-io/MIPs#121 - Cancelling deleted translation suggestions - Fixed Languages Filter UI bug - Improved suggestions approved event by removing unnecessary network request (graphql) * fix: human translation bug fix - Meeds-io/MIPs#121 Accept both human and machine translations when you don't check the box for human translation --- .../crowdin/model/RemoteTranslation.java | 14 --- .../crowdin/plugin/CrowdinEventPlugin.java | 14 +-- .../crowdin/plugin/CrowdinTriggerPlugin.java | 13 +-- .../StringCommentCreatedTriggerPlugin.java | 24 ++--- .../plugin/SuggestionAddedTriggerPlugin.java | 64 ++++++++----- .../SuggestionApprovedTriggerPlugin.java | 78 ++++++---------- .../services/CrowdinTriggerService.java | 83 ++++------------- .../storage/CrowdinConsumerStorage.java | 90 +------------------ .../gamification/crowdin/utils/Utils.java | 27 +++++- .../components/CrowdinEventForm.vue | 5 +- .../engagementCenterExtensions/extensions.js | 9 +- 11 files changed, 134 insertions(+), 287 deletions(-) delete mode 100644 gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/model/RemoteTranslation.java diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/model/RemoteTranslation.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/model/RemoteTranslation.java deleted file mode 100644 index 7f5fed3..0000000 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/model/RemoteTranslation.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.meeds.gamification.crowdin.model; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@AllArgsConstructor -@NoArgsConstructor -public class RemoteTranslation { - private long id; - private String projectId; - private String username; -} diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinEventPlugin.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinEventPlugin.java index 4c6e396..bd72ec8 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinEventPlugin.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinEventPlugin.java @@ -4,8 +4,6 @@ import io.meeds.gamification.service.EventService; import jakarta.annotation.PostConstruct; import org.apache.commons.collections.CollectionUtils; -import org.exoplatform.services.log.ExoLogger; -import org.exoplatform.services.log.Log; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -15,8 +13,6 @@ @Component public class CrowdinEventPlugin extends EventPlugin { - private static final Log LOG = ExoLogger.getLogger(CrowdinEventPlugin.class); - public static final String EVENT_TYPE = "crowdin"; @Autowired @@ -44,9 +40,6 @@ public List getTriggers() { @Override public boolean isValidEvent(Map eventProperties, String triggerDetails) { - LOG.info("isValidEvent: started"); - LOG.info("eventProperties: " + eventProperties); - LOG.info("triggerDetails: " + triggerDetails); String desiredProjectId = eventProperties.get(PROJECT_ID); @@ -62,15 +55,10 @@ public boolean isValidEvent(Map eventProperties, String triggerD .split(",")) : Collections.emptyList(); - LOG.info("desiredDirectoryIds: " + desiredDirectoryIds); - LOG.info("desiredLanguageIds: " + desiredLanguageIds); - - Map triggerDetailsMop = stringToMap(triggerDetails); - LOG.info("triggerDetailsMop: " + triggerDetailsMop); return desiredProjectId.equals(triggerDetailsMop.get(PROJECT_ID)) - && desiredMustBeHuman.equals(triggerDetailsMop.get(MUST_BE_HUMAN)) + && (desiredMustBeHuman.equals("false") || desiredMustBeHuman.equals(triggerDetailsMop.get(MUST_BE_HUMAN))) && (CollectionUtils.isEmpty(desiredDirectoryIds) || desiredDirectoryIds.contains(triggerDetailsMop.get(DIRECTORY_ID))) && (CollectionUtils.isEmpty(desiredLanguageIds) || desiredLanguageIds.contains(triggerDetailsMop.get(LANGUAGE_ID))); } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinTriggerPlugin.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinTriggerPlugin.java index f59ec0a..b5b0903 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinTriggerPlugin.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/CrowdinTriggerPlugin.java @@ -11,24 +11,15 @@ public abstract class CrowdinTriggerPlugin extends BaseComponentPlugin { /** * Gets List of triggered events * + * @param trigger trigger event name * @param payload payload The raw payload of the webhook request. - * @param object additional processing object * @return List of triggered events */ public abstract List getEvents( String trigger, - Map payload, - Object object); + Map payload); public abstract String getEventName(); public abstract String getCancellingEventName(); - - /** - * Gets json object event key name in the payload - * - * @return object name - */ - public abstract String getPayloadObjectName(); public abstract String getProjectId(Map payload); - public abstract boolean batchQueryRemoteTranslations(); } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/StringCommentCreatedTriggerPlugin.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/StringCommentCreatedTriggerPlugin.java index 9715211..b335aac 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/StringCommentCreatedTriggerPlugin.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/StringCommentCreatedTriggerPlugin.java @@ -28,16 +28,16 @@ public void initData() { } @Override - public List getEvents(String trigger, Map payload, Object object) { + public List getEvents(String trigger, Map payload) { return Collections.singletonList(new Event(STRING_COMMENT_CREATED_EVENT_NAME, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "url"), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + constructObjectIdAsJsonString(payload, EVENT_PAYLOAD_OBJECT_NAME), EVENT_PAYLOAD_OBJECT_NAME, getProjectId(payload), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "targetLanguage", "id"), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, TARGET_LANGUAGE, ID), true, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "file", "directoryId"), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, FILE, DIRECTORY_ID), trigger.equals(CANCELLING_EVENT_TRIGGER))); } @@ -51,18 +51,8 @@ public String getCancellingEventName() { return CANCELLING_EVENT_TRIGGER; } - @Override - public String getPayloadObjectName() { - return EVENT_PAYLOAD_OBJECT_NAME; - } - @Override public String getProjectId(Map payload) { - return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "project", "id"); - } - - @Override - public boolean batchQueryRemoteTranslations() { - return false; + return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, PROJECT, ID); } } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionAddedTriggerPlugin.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionAddedTriggerPlugin.java index afa32ef..7e3ed73 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionAddedTriggerPlugin.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionAddedTriggerPlugin.java @@ -2,6 +2,8 @@ import io.meeds.gamification.crowdin.model.Event; import io.meeds.gamification.crowdin.services.CrowdinTriggerService; +import io.meeds.gamification.model.RealizationDTO; +import io.meeds.gamification.service.RealizationService; import jakarta.annotation.PostConstruct; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; @@ -24,24 +26,52 @@ public class SuggestionAddedTriggerPlugin extends CrowdinTriggerPlugin { @Autowired private CrowdinTriggerService crowdinTriggerService; + @Autowired + private RealizationService realizationService; + @PostConstruct public void initData() { crowdinTriggerService.addPlugin(this); } + @SuppressWarnings("unchecked") @Override - public List getEvents(String trigger, Map payload, Object object) { + public List getEvents(String trigger, Map payload) { + String objectId = constructObjectIdAsJsonString(payload, EVENT_PAYLOAD_OBJECT_NAME); + + if (trigger.equals(CROWDIN_EVENT_TRIGGER)) { + return Collections.singletonList(new Event(SUGGESTION_ADDED_EVENT_NAME, + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + objectId, + EVENT_PAYLOAD_OBJECT_NAME, + getProjectId(payload), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, TARGET_LANGUAGE, ID), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, PROVIDER) == null, + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, FILE, DIRECTORY_ID), + false)); + } else if (trigger.equals(CANCELLING_EVENT_TRIGGER)) { + List realizations = realizationService. + findRealizationsByObjectIdAndObjectType(objectId, EVENT_PAYLOAD_OBJECT_NAME); - return Collections.singletonList(new Event(SUGGESTION_ADDED_EVENT_NAME, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "url"), - EVENT_PAYLOAD_OBJECT_NAME, - getProjectId(payload), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "targetLanguage", "id"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "provider") == null, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "file", "directoryId"), - trigger.equals(CANCELLING_EVENT_TRIGGER))); + if ( ! realizations.isEmpty()) { + String earnerId = realizations.get(0).getEarnerId(); + + return Collections.singletonList(new Event(SUGGESTION_ADDED_EVENT_NAME, + earnerId, + earnerId, + objectId, + EVENT_PAYLOAD_OBJECT_NAME, + getProjectId(payload), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, TARGET_LANGUAGE, ID), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, PROVIDER) == null, + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, FILE, DIRECTORY_ID), + true)); + } + } else { + LOG.error("Unknown crowdin hook event {}", trigger); + } + return Collections.emptyList(); } @Override @@ -54,18 +84,8 @@ public String getCancellingEventName() { return CANCELLING_EVENT_TRIGGER; } - @Override - public String getPayloadObjectName() { - return EVENT_PAYLOAD_OBJECT_NAME; - } - @Override public String getProjectId(Map payload) { - return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "project", "id"); - } - - @Override - public boolean batchQueryRemoteTranslations() { - return false; + return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, PROJECT, ID); } } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionApprovedTriggerPlugin.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionApprovedTriggerPlugin.java index ad5bca7..c48acbc 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionApprovedTriggerPlugin.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/plugin/SuggestionApprovedTriggerPlugin.java @@ -1,8 +1,9 @@ package io.meeds.gamification.crowdin.plugin; import io.meeds.gamification.crowdin.model.Event; -import io.meeds.gamification.crowdin.model.RemoteTranslation; import io.meeds.gamification.crowdin.services.CrowdinTriggerService; +import io.meeds.gamification.model.RealizationDTO; +import io.meeds.gamification.service.RealizationService; import jakarta.annotation.PostConstruct; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; @@ -10,7 +11,6 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; @@ -26,6 +26,9 @@ public class SuggestionApprovedTriggerPlugin extends CrowdinTriggerPlugin { @Autowired private CrowdinTriggerService crowdinTriggerService; + @Autowired + private RealizationService realizationService; + @PostConstruct public void initData() { crowdinTriggerService.addPlugin(this); @@ -33,50 +36,37 @@ public void initData() { @SuppressWarnings("unchecked") @Override - public List getEvents(String trigger, Map payload, Object object) { + public List getEvents(String trigger, Map payload) { + String objectId = constructObjectIdAsJsonString(payload, EVENT_PAYLOAD_OBJECT_NAME); List eventList = new ArrayList<>(); eventList.add(new Event(APPROVE_SUGGESTION_EVENT_NAME, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "user", "username"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "url"), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, USER, USERNAME), + objectId, EVENT_PAYLOAD_OBJECT_NAME, getProjectId(payload), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "targetLanguage", "id"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "provider") == null, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "file", "directoryId"), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, TARGET_LANGUAGE, ID), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, PROVIDER) == null, + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, FILE, DIRECTORY_ID), trigger.equals(CANCELLING_EVENT_TRIGGER))); - if (object == null) { - return eventList; - } + List realizations = realizationService. + findRealizationsByObjectIdAndObjectType(objectId, EVENT_PAYLOAD_OBJECT_NAME); + + if ( ! realizations.isEmpty()) { + String earnerId = realizations.get(0).getEarnerId(); + eventList.add(new Event(SUGGESTION_APPROVED_EVENT_NAME, + earnerId, + earnerId, + objectId, + EVENT_PAYLOAD_OBJECT_NAME, + getProjectId(payload), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, TARGET_LANGUAGE, ID), + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, PROVIDER) == null, + extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, FILE, DIRECTORY_ID), + trigger.equals(CANCELLING_EVENT_TRIGGER))); - List remoteTranslations = (List) object; - LOG.debug("remoteTranslations: " + remoteTranslations.size()); - String translationId = extractSubItem(payload, getPayloadObjectName(), "id"); - if (translationId != null) { - - RemoteTranslation translationById = null; - - for (RemoteTranslation translation : remoteTranslations) { - if (translation.getId() == Long.parseLong(translationId)) { - translationById = translation; - break; - } - } - - if (translationById != null) { - eventList.add(new Event(SUGGESTION_APPROVED_EVENT_NAME, - translationById.getUsername(), - translationById.getUsername(), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "url"), - EVENT_PAYLOAD_OBJECT_NAME, - getProjectId(payload), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "targetLanguage", "id"), - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "provider") == null, - extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "file", "directoryId"), - trigger.equals(CANCELLING_EVENT_TRIGGER))); - } } return eventList; @@ -92,18 +82,8 @@ public String getCancellingEventName() { return CANCELLING_EVENT_TRIGGER; } - @Override - public String getPayloadObjectName() { - return EVENT_PAYLOAD_OBJECT_NAME; - } - @Override public String getProjectId(Map payload) { - return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, "string", "project", "id"); - } - - @Override - public boolean batchQueryRemoteTranslations() { - return true; + return extractSubItem(payload, EVENT_PAYLOAD_OBJECT_NAME, STRING, PROJECT, ID); } } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/services/CrowdinTriggerService.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/services/CrowdinTriggerService.java index 50c146f..3fe8e49 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/services/CrowdinTriggerService.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/services/CrowdinTriggerService.java @@ -2,14 +2,13 @@ import io.meeds.common.ContainerTransactional; import io.meeds.gamification.crowdin.model.Event; -import io.meeds.gamification.crowdin.model.RemoteTranslation; import io.meeds.gamification.crowdin.model.WebHook; import io.meeds.gamification.crowdin.plugin.CrowdinTriggerPlugin; -import io.meeds.gamification.crowdin.storage.CrowdinConsumerStorage; import io.meeds.gamification.crowdin.storage.WebHookStorage; import io.meeds.gamification.service.ConnectorService; import io.meeds.gamification.service.TriggerService; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.exoplatform.services.listener.ListenerService; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; @@ -19,7 +18,9 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import static io.meeds.gamification.crowdin.utils.Utils.*; @@ -44,9 +45,6 @@ public class CrowdinTriggerService { @Autowired private WebHookStorage webHookStorage; - @Autowired - private CrowdinConsumerStorage crowdinConsumerStorage; - @Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; @@ -64,8 +62,6 @@ private void handleTrigger(String bearerToken, String payload) { List> eventsListMap = (List>) eventsObj; LOG.info("Total Events: " + eventsListMap.size()); - List remoteTranslationList = getBatchRemoteTranslations(eventsListMap); - for (Map eventMap: eventsListMap) { String trigger = extractSubItem(eventMap, "event"); CrowdinTriggerPlugin triggerPlugin = getCrowdinTriggerPlugin(trigger); @@ -91,11 +87,7 @@ private void handleTrigger(String bearerToken, String payload) { continue; } - List filteredList = remoteTranslationList.stream() - .filter(translation -> translation.getProjectId() .equals(projectId)) - .toList(); - - processEvents(triggerPlugin.getEvents(trigger, eventMap, filteredList), projectId); + processEvents(triggerPlugin.getEvents(trigger, eventMap), projectId); } } } @@ -109,19 +101,25 @@ private boolean isTriggerEnabled(String trigger, String projectId) { } private void processEvent(Event event) { - String receiverId = connectorService.getAssociatedUsername(CONNECTOR_NAME, event.getReceiver()); + String receiverId = NumberUtils.isDigits(event.getReceiver()) ? event.getReceiver() : + connectorService.getAssociatedUsername(CONNECTOR_NAME, event.getReceiver()); String senderId; - if (event.getSender() != null && !StringUtils.equals(event.getReceiver(), event.getSender())) { + if (!NumberUtils.isDigits(event.getSender()) && event.getSender() != null + && !StringUtils.equals(event.getReceiver(), event.getSender())) { senderId = connectorService.getAssociatedUsername(CONNECTOR_NAME, event.getSender()); } else { senderId = receiverId; } LOG.info("processEvent: senderId: " + senderId); if (StringUtils.isNotBlank(senderId)) { - Identity socialIdentity = identityManager.getOrCreateUserIdentity(senderId); - LOG.info("processEvent: socialIdentity: " + socialIdentity); - if (socialIdentity != null) { + if (NumberUtils.isDigits(senderId)) { broadcastCrowdinEvent(event, senderId, receiverId); + } else { + Identity socialIdentity = identityManager.getOrCreateUserIdentity(senderId); + LOG.info("processEvent: socialIdentity: " + socialIdentity); + if (socialIdentity != null) { + broadcastCrowdinEvent(event, senderId, receiverId); + } } } } @@ -161,53 +159,4 @@ public void addPlugin(CrowdinTriggerPlugin crowdinTriggerPlugin) { triggerPlugins.put(crowdinTriggerPlugin.getCancellingEventName(), crowdinTriggerPlugin); } - public List getBatchRemoteTranslations( - List> eventsListMap) { - - List remoteTranslationList = new ArrayList<>(); - - for (Map.Entry entry : triggerPlugins.entrySet()) { - - CrowdinTriggerPlugin crowdinTriggerPlugin = entry.getValue(); - - if (! crowdinTriggerPlugin.batchQueryRemoteTranslations()) { - continue; - } - - List projectIds = eventsListMap.stream() - .filter(map -> map.containsKey("event") && map.get("event").equals(crowdinTriggerPlugin.getEventName())) - .map(crowdinTriggerPlugin::getProjectId) - .filter(Objects::nonNull) - .distinct() - .toList(); - - for (String projectId : projectIds) { - - WebHook webHook = webHookStorage.getWebhookByProjectId(Long.parseLong(projectId)); - - List translationIds = eventsListMap.stream() - .filter(map -> map.containsKey("event") && map.get("event").equals(crowdinTriggerPlugin.getEventName())) - .filter(map -> Objects.equals(crowdinTriggerPlugin.getProjectId(map), projectId)) - .map(map -> extractSubItem(map, crowdinTriggerPlugin.getPayloadObjectName(), "id")) - .filter(Objects::nonNull) - .distinct() - .toList(); - - try { - - remoteTranslationList.addAll( - crowdinConsumerStorage.getProjectFilteredRemoteTranslations( - projectId, translationIds, webHook.getToken() - ) - ); - - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } - } - } - - return remoteTranslationList; - } - } diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/storage/CrowdinConsumerStorage.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/storage/CrowdinConsumerStorage.java index fd8885d..4d63eda 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/storage/CrowdinConsumerStorage.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/storage/CrowdinConsumerStorage.java @@ -18,11 +18,13 @@ package io.meeds.gamification.crowdin.storage; import io.meeds.gamification.crowdin.exception.CrowdinConnectionException; -import io.meeds.gamification.crowdin.model.*; +import io.meeds.gamification.crowdin.model.RemoteDirectory; +import io.meeds.gamification.crowdin.model.RemoteLanguage; +import io.meeds.gamification.crowdin.model.RemoteProject; +import io.meeds.gamification.crowdin.model.WebHook; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.hc.core5.net.URIBuilder; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpDelete; @@ -47,7 +49,6 @@ import java.io.IOException; import java.io.InputStream; import java.net.URI; -import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; @@ -293,89 +294,6 @@ public String deleteWebhook(WebHook webHook) { } } - public List getProjectFilteredRemoteTranslations( - String projectId, - List filterTranslationIds, - String accessToken) throws IllegalAccessException { - - try { - StringBuilder query = new StringBuilder("{" + - " viewer {" + - " projects(first: 1, filter: {" + - " id: {equals: " + projectId + "}" ); - query.append("}) { edges { node { translations ( first: ") - .append(filterTranslationIds.size()).append(", filter: {\n").append("id: { equals: ") - .append(filterTranslationIds.get(0)).append("},"); - - for(int i = 1; i < filterTranslationIds.size(); i++) { - query.append("or: {id: { equals: ").append(filterTranslationIds.get(i)).append("}, \n"); - } - query.append("}".repeat(filterTranslationIds.size() - 1)); - - query.append(""" - } - ) { - totalCount - edges { - node { - ... on PlainStringTranslation { - id - user { - username - } - } - } - } - } - } - } - } - } - } - """); - - URI uri = new URIBuilder(CROWDIN_GRAPHQL_API_URL) - .addParameter("query", query.toString()) - .build(); - - String response = processGet(uri, accessToken); - - return extractTranslations(response, projectId); - } catch (CrowdinConnectionException e) { - throw new IllegalAccessException("crowdin.tokenExpiredOrInvalid"); - } catch (URISyntaxException e) { - throw new RuntimeException(e); - } - } - - private static List extractTranslations(String jsonString, String projectId) { - List remoteTranslationList = new ArrayList<>(); - - JSONObject jsonObject = new JSONObject(jsonString); - JSONObject data = jsonObject.getJSONObject("data"); - JSONObject viewer = data.getJSONObject("viewer"); - JSONArray projectsEdges = viewer.getJSONObject("projects").getJSONArray("edges"); - - for (int i = 0; i < projectsEdges.length(); i++) { - JSONObject edge = projectsEdges.getJSONObject(i); - JSONObject node = edge.getJSONObject("node"); - JSONObject translations = node.getJSONObject("translations"); - JSONArray edges = translations.getJSONArray("edges"); - - for (int j = 0; j < edges.length(); j++) { - JSONObject translationJSON = edges.getJSONObject(j).getJSONObject("node"); - long id = translationJSON.getLong("id"); - String username = translationJSON.getJSONObject("user").getString("username"); - - RemoteTranslation translation = new RemoteTranslation(); - translation.setId(id); - translation.setProjectId(projectId); - translation.setUsername(username); - remoteTranslationList.add(translation); - } - } - return remoteTranslationList; - } public List getProjectDirectories( long remoteProjectId, int offset, int limit, String accessToken diff --git a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/utils/Utils.java b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/utils/Utils.java index 0bd8529..9e01260 100644 --- a/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/utils/Utils.java +++ b/gamification-crowdin-services/src/main/java/io/meeds/gamification/crowdin/utils/Utils.java @@ -19,7 +19,6 @@ public class Utils { public static final String AUTHORIZATION = "Authorization"; public static final String TOKEN = "Bearer "; public static final String CROWDIN_API_URL = "https://api.crowdin.com/api/v2"; - public static final String CROWDIN_GRAPHQL_API_URL = "https://api.crowdin.com/api/graphql"; public static final String PROJECTS = "/projects/"; public static final String WEBHOOKS = "/webhooks/"; public static final String AUTHORIZED_TO_ACCESS_CROWDIN_HOOKS = "The user is not authorized to access crowdin Hooks"; @@ -33,9 +32,19 @@ public class Utils { public static final String APPROVE_SUGGESTION_EVENT_NAME = "approveSuggestion"; public static final String DIRECTORY_IDS = "directoryIds"; public static final String DIRECTORY_ID = "directoryId"; - public static final String LANGUAGE_IDS = "languageIds"; - public static final String LANGUAGE_ID = "languageId"; - public static final String MUST_BE_HUMAN = "mustBeHuman"; + public static final String LANGUAGE_IDS = "languageIds"; + public static final String LANGUAGE_ID = "languageId"; + public static final String MUST_BE_HUMAN = "mustBeHuman"; + public static final String STRING = "string"; + public static final String TARGET_LANGUAGE = "targetLanguage"; + public static final String PROJECT = "project"; + public static final String ID = "id"; + public static final String FILE = "file"; + public static final String USER = "user"; + public static final String USERNAME = "username"; + public static final String SOURCE_LANGUAGE_ID = "sourceLanguageId"; + public static final String IDENTIFIER = "identifier"; + public static final String PROVIDER = "provider"; public static String encode(String token) { try { @@ -106,4 +115,14 @@ public static boolean verifyWebhookSecret(String bearerToken, String expected) { } return expected.equals(bearerToken); } + + public static String constructObjectIdAsJsonString(Map payload, String payloadObjectName) { + String id = extractSubItem(payload, payloadObjectName, ID); + String projectSlug = extractSubItem(payload, payloadObjectName, STRING, PROJECT, IDENTIFIER); + String fileId = extractSubItem(payload, payloadObjectName, STRING, FILE, ID); + String sourceLanguageId = extractSubItem(payload, payloadObjectName, STRING, PROJECT, SOURCE_LANGUAGE_ID); + String targetLanguageId = extractSubItem(payload, payloadObjectName, TARGET_LANGUAGE, ID); + return "{\"id\":"+ id +",\"stringUrl\":\"https://crowdin.com/editor/" + + projectSlug + "/"+ fileId +"/"+ sourceLanguageId +"-"+ targetLanguageId + "\"}"; + } } diff --git a/gamification-crowdin-webapp/src/main/webapp/vue-app/connectorEventExtensions/components/CrowdinEventForm.vue b/gamification-crowdin-webapp/src/main/webapp/vue-app/connectorEventExtensions/components/CrowdinEventForm.vue index ce12818..3304abf 100644 --- a/gamification-crowdin-webapp/src/main/webapp/vue-app/connectorEventExtensions/components/CrowdinEventForm.vue +++ b/gamification-crowdin-webapp/src/main/webapp/vue-app/connectorEventExtensions/components/CrowdinEventForm.vue @@ -276,18 +276,19 @@ export default { } this.languages = this.selected?.languages; - this.loadingProjects = false; if (this.properties?.languageIds) { const selectedLanguagesArray = this.properties?.languageIds?.split(','); this.languages.forEach(rep => { - if (selectedLanguagesArray.map(str => Number(str)).includes(Number(rep.id))) { + if (selectedLanguagesArray.includes(rep.id)) { if (!this.selectedLanguages.some(c => (c?.id === rep.id) || (c === rep.id))) { this.selectedLanguages.push(rep.id); } } }); } + + this.loadingProjects = false; }); }, retrieveDirectories() { diff --git a/gamification-crowdin-webapp/src/main/webapp/vue-app/engagementCenterExtensions/extensions.js b/gamification-crowdin-webapp/src/main/webapp/vue-app/engagementCenterExtensions/extensions.js index 0916803..3748534 100644 --- a/gamification-crowdin-webapp/src/main/webapp/vue-app/engagementCenterExtensions/extensions.js +++ b/gamification-crowdin-webapp/src/main/webapp/vue-app/engagementCenterExtensions/extensions.js @@ -11,8 +11,13 @@ export function init() { 'approveSuggestion' ].includes(actionLabel), getLink: (realization) => { - realization.link = realization.objectId; - return realization.link; + try { + const objId = JSON.parse(realization.objectId); + realization.link = objId.stringUrl; + return realization.link; + } catch (e) { + return null; + } }, isExtensible: true },