diff --git a/src/main/java/org/mskcc/cbio/oncokb/domain/enumeration/EmailCategory.java b/src/main/java/org/mskcc/cbio/oncokb/domain/enumeration/EmailCategory.java index 345460bb8..e84d370bb 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/domain/enumeration/EmailCategory.java +++ b/src/main/java/org/mskcc/cbio/oncokb/domain/enumeration/EmailCategory.java @@ -4,9 +4,16 @@ * The EmailCategory enumeration. */ public enum EmailCategory { - APPROVE, - TRIAL, - DENY, - CLARIFY, - LICENSE + TRIAL("Trial"), + LICENSE("License"), + CLARIFY("Clarify"), + DENY("Deny"); + + String label; + + EmailCategory(String label) { + this.label = label; + } + + public String getLabel() { return label; } } diff --git a/src/main/java/org/mskcc/cbio/oncokb/service/SlackService.java b/src/main/java/org/mskcc/cbio/oncokb/service/SlackService.java index f94242bdc..7330acd3e 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/service/SlackService.java +++ b/src/main/java/org/mskcc/cbio/oncokb/service/SlackService.java @@ -99,7 +99,7 @@ public void sendUserRegistrationToChannel(UserDTO user, boolean trialAccountActi @Async public void sendLatestBlocks(String url, UserDTO userDTO, boolean trialAccountActivated, ActionId actionId, String triggerId) { - if (ActionId.isEmailAction(actionId)) { + if (ActionId.isModalEmailAction(actionId)) { this.sendModal(triggerId, this.buildModalView(userDTO, actionId, url)); } else { this.sendBlocks(url, this.buildBlocks(userDTO, trialAccountActivated, actionId, null)); @@ -249,7 +249,7 @@ public List buildBlocks(UserDTO userDTO, boolean trialAccountActiva if (buildCollapsed) { // Add collapsed blocks - blocks.add(buildCollapsedBlock(userDTO, actionId)); + blocks.add(buildCollapsedBlock(userDTO, trialAccountActivated, actionId)); } else { // Add expanded blocks blocks.addAll(buildExpandedBlocks(userDTO, trialAccountActivated, actionId, company)); @@ -261,9 +261,11 @@ public List buildBlocks(UserDTO userDTO, boolean trialAccountActiva return blocks; } - private LayoutBlock buildCollapsedBlock(UserDTO userDTO, ActionId actionId) { + private LayoutBlock buildCollapsedBlock(UserDTO userDTO, boolean trialAccountActivated, ActionId actionId) { StringBuilder sb = new StringBuilder(); - sb.append(userDTO.getEmail() + "\n" + userDTO.getCompanyName() + " (" + userDTO.getLicenseType().getShortName() + (withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, userDTO, actionId) ? ", *TRIAL*)" : userDTO.isActivated() ? ")" : ")\n*NOT ACTIVATED*: ")); + sb.append(userDTO.getEmail() + "\n" + userDTO.getCompanyName() + " (" + userDTO.getLicenseType().getShortName() + + ((withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, userDTO, actionId) && !(userDTO.isActivated() && !trialAccountActivated)) ? ", *TRIAL*)" : + (userDTO.isActivated() ? ")" : ")\n*NOT ACTIVATED*: "))); if (!userDTO.isActivated() && !withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, userDTO, actionId)) { List sentMails = new ArrayList<>(); for (DropdownEmailOption mailOption : DropdownEmailOption.values()) { @@ -303,7 +305,7 @@ private List buildExpandedBlocks(UserDTO userDTO, boolean trialAcco blocks.add(buildCurrentLicense(userDTO)); // Add account status - blocks.add(buildAccountStatusBlock(userDTO, withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, userDTO, actionId))); + blocks.add(buildAccountStatusBlock(userDTO, withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, userDTO, actionId), trialAccountActivated)); // Add user info section blocks.addAll(buildUserInfoBlocks(userDTO)); @@ -365,13 +367,13 @@ private LayoutBlock buildCurrentLicense(UserDTO userDTO) { return SectionBlock.builder().text(MarkdownTextObject.builder().text(sb.toString()).build()).accessory(getLicenseTypeElement(userDTO)).blockId(LICENSE_TYPE.getId()).build(); } - private LayoutBlock buildAccountStatusBlock(UserDTO userDTO, boolean isTrialAccountInitiated) { + private LayoutBlock buildAccountStatusBlock(UserDTO userDTO, boolean isTrialAccountInitiated, boolean trialAccountActivated) { List userInfo = new ArrayList<>(); // Add account information userInfo.add(getTextObject("Account Status", userDTO.isActivated() ? "Activated" : (StringUtils.isNotEmpty(userDTO.getActivationKey()) ? "Email not validated" : "Not Activated"))); - userInfo.add(getTextObject("Account Type", isTrialAccountInitiated ? "TRIAL" : "REGULAR")); - if (isTrialAccountInitiated) { + userInfo.add(getTextObject("Account Type", isTrialAccountInitiated && !(userDTO.isActivated() && !trialAccountActivated) ? "TRIAL" : "REGULAR")); + if (isTrialAccountInitiated && !(userDTO.isActivated() && !trialAccountActivated)) { // There is a period of time when the user has been approved but did not activate their trial yet. // In this case, the activationDate is null, so we need to omit this text. Instant activationDate = userDTO.getAdditionalInfo().getTrialAccount().getActivation().getActivationDate(); @@ -576,43 +578,34 @@ private ButtonElement buildApproveButton(UserDTO user) { private StaticSelectElement buildMoreActionsDropdown(UserDTO user, boolean trialAccountActivated, ActionId actionId) { List optionGroups = new ArrayList<>(); + // Add option group - Trial if (user.getLicenseType() != LicenseType.ACADEMIC) { - // Add option group - Trial List trialGroup = new ArrayList<>(); // Add option - Give Trial Access if (!withNote(DropdownEmailOption.GIVE_TRIAL_ACCESS, user, actionId) && !user.isActivated()) { trialGroup.add(buildEmailOption(DropdownEmailOption.GIVE_TRIAL_ACCESS, user)); } // Add option - Convert to regular - if (trialAccountActivated) { + if (user.isActivated() && trialAccountActivated) { trialGroup.add(buildConvertToRegularAccountOption(user)); } if (!trialGroup.isEmpty()) { optionGroups.add(OptionGroupObject.builder().label(PlainTextObject.builder().text("Trial").build()).options(trialGroup).build()); } - - // Add option group - License - List licenseGroup = new ArrayList<>(); - for (DropdownEmailOption licenseOption: Arrays.stream(DropdownEmailOption.values()).filter(mo -> mo.getCategory() == EmailCategory.LICENSE).collect(Collectors.toList())) { - licenseGroup.add(buildEmailOption(licenseOption, user)); - } - optionGroups.add(OptionGroupObject.builder().label(PlainTextObject.builder().text("License").build()).options(licenseGroup).build()); } + // Add other option groups if (!user.isActivated()) { - // Add option group - Clarify - List clarifyGroup = new ArrayList<>(); - for (DropdownEmailOption clarifyOption : Arrays.stream(DropdownEmailOption.values()).filter(mo -> mo.getCategory() == EmailCategory.CLARIFY).collect(Collectors.toList())) { - clarifyGroup.add(buildEmailOption(clarifyOption, user)); - } - optionGroups.add(OptionGroupObject.builder().label(PlainTextObject.builder().text("Clarify").build()).options(clarifyGroup).build()); - - // Add option group - Deny - List denyGroup = new ArrayList<>(); - for (DropdownEmailOption denyOption : Arrays.stream(DropdownEmailOption.values()).filter(mo -> mo.getCategory() == EmailCategory.DENY).collect(Collectors.toList())) { - denyGroup.add(buildEmailOption(denyOption, user)); + for (EmailCategory emailCategory : Arrays.stream(EmailCategory.values()).filter(ec -> !ec.equals(EmailCategory.TRIAL)).collect(Collectors.toList())) { + List optionGroup = new ArrayList<>(); + for (DropdownEmailOption emailOption : Arrays.stream(DropdownEmailOption.values()).filter(eo -> eo.getCategory().equals(emailCategory)).collect(Collectors.toList())) { + if (emailOption.getSpecificLicenses().isEmpty() || emailOption.getSpecificLicenses().contains(user.getLicenseType())) + optionGroup.add(buildEmailOption(emailOption, user)); + } + if (!optionGroup.isEmpty()) { + optionGroups.add(OptionGroupObject.builder().label(PlainTextObject.builder().text(emailCategory.getLabel()).build()).options(optionGroup).build()); + } } - optionGroups.add(OptionGroupObject.builder().label(PlainTextObject.builder().text("Deny").build()).options(denyGroup).build()); } // Add option group - Other diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/ActionId.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/ActionId.java index b608dbcd4..25dbc068f 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/ActionId.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/ActionId.java @@ -1,5 +1,8 @@ package org.mskcc.cbio.oncokb.web.rest.slack; +import java.util.Arrays; +import java.util.stream.Collectors; + /** * Created by Hongxin Zhang on 4/30/21. */ @@ -51,11 +54,11 @@ public static ActionId getById(String id) { return null; } - public static boolean isEmailAction(ActionId actionId) { + public static boolean isModalEmailAction(ActionId actionId) { if (actionId == null) { return false; } - for (DropdownEmailOption mailOption : DropdownEmailOption.values()) { + for (DropdownEmailOption mailOption : Arrays.stream(DropdownEmailOption.values()).filter(mo -> !mo.isNotModalEmail()).collect(Collectors.toList())) { if (actionId.equals(mailOption.getActionId())) return true; } diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/DropdownEmailOption.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/DropdownEmailOption.java index dcbb20c56..c543ef6a2 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/DropdownEmailOption.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/slack/DropdownEmailOption.java @@ -1,10 +1,12 @@ package org.mskcc.cbio.oncokb.web.rest.slack; -import jdk.nashorn.internal.ir.Block; import org.mskcc.cbio.oncokb.domain.enumeration.EmailCategory; import org.mskcc.cbio.oncokb.domain.enumeration.EmailSubject; +import org.mskcc.cbio.oncokb.domain.enumeration.LicenseType; import org.mskcc.cbio.oncokb.domain.enumeration.MailType; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; /** @@ -20,6 +22,7 @@ public enum DropdownEmailOption { .mailType(MailType.ACTIVATE_FREE_TRIAL) .category(EmailCategory.TRIAL) .dropdownKey("Give Trial Access") + .isNotModalEmail() .expandedNote("The trial account has been initialized and notified.")) , CLARIFY_ACADEMIC_FOR_PROFIT(new DropdownEmailOptionBuilder() .blockId(BlockId.FOR_PROFIT_CLARIFICATION_NOTE) @@ -27,6 +30,7 @@ public enum DropdownEmailOption { .confirmActionId(ActionId.CONFIRM_SEND_ACADEMIC_FOR_PROFIT_EMAIL) .mailType(MailType.CLARIFY_ACADEMIC_FOR_PROFIT) .category(EmailCategory.CLARIFY) + .specificLicense(LicenseType.ACADEMIC) .dropdownKey("Send Academic For Profit Email") .modalTitle("For Profit Clarification") .modalSubject(EmailSubject.DEFAULT) @@ -38,6 +42,7 @@ public enum DropdownEmailOption { .confirmActionId(ActionId.CONFIRM_SEND_ACADEMIC_CLARIFICATION_EMAIL) .mailType(MailType.CLARIFY_ACADEMIC_NON_INSTITUTE_EMAIL) .category(EmailCategory.CLARIFY) + .specificLicense(LicenseType.ACADEMIC) .dropdownKey("Send Academic Domain Clarification Email") .modalTitle("Domain Clarification") .modalSubject(EmailSubject.DEFAULT) @@ -82,6 +87,9 @@ public enum DropdownEmailOption { .confirmActionId(ActionId.CONFIRM_SEND_LICENSE_OPTIONS_EMAIL) .mailType(MailType.LICENSE_OPTIONS) .category(EmailCategory.LICENSE) + .specificLicense(LicenseType.COMMERCIAL) + .specificLicense(LicenseType.HOSPITAL) + .specificLicense(LicenseType.RESEARCH_IN_COMMERCIAL) .dropdownKey("Send License Options Email") .modalTitle("Send License Options") .modalSubject(EmailSubject.COMPANY) @@ -121,8 +129,10 @@ private static class DropdownEmailOptionBuilder { private MailType mailType; // Dropdown menu private EmailCategory category; + private List specificLicenses = new ArrayList<>(); private String dropdownKey; // View modal + private boolean notModalEmail = false; private Optional modalTitle = Optional.empty(); private Optional modalSubject = Optional.of(EmailSubject.DEFAULT); // Additional info block @@ -149,6 +159,11 @@ public DropdownEmailOptionBuilder mailType(MailType mailType) { return this; } + public DropdownEmailOptionBuilder isNotModalEmail() { + this.notModalEmail = true; + return this; + } + public DropdownEmailOptionBuilder modalTitle(String modalTitle) { this.modalTitle = Optional.ofNullable(modalTitle); return this; @@ -159,6 +174,11 @@ public DropdownEmailOptionBuilder category(EmailCategory category) { return this; } + public DropdownEmailOptionBuilder specificLicense(LicenseType licenseType) { + specificLicenses.add(licenseType); + return this; + } + public DropdownEmailOptionBuilder dropdownKey(String dropdownKey) { this.dropdownKey = dropdownKey; return this; @@ -188,8 +208,10 @@ public DropdownEmailOptionBuilder expandedNote(String expandedNote) { private MailType mailType; // Dropdown menu private EmailCategory category; + private List specificLicenses; private String dropdownKey; // View modal + private boolean notModalEmail; private Optional modalTitle; private Optional modalSubject; // Additional info block @@ -202,7 +224,9 @@ public DropdownEmailOptionBuilder expandedNote(String expandedNote) { this.confirmActionId = builder.confirmActionId; this.mailType = builder.mailType; this.category = builder.category; + this.specificLicenses = builder.specificLicenses; this.dropdownKey = builder.dropdownKey; + this.notModalEmail = builder.notModalEmail; this.modalTitle = builder.modalTitle; this.modalSubject = builder.modalSubject; this.collapsedNote = builder.collapsedNote; @@ -225,14 +249,16 @@ public MailType getMailType() { return mailType; } - public EmailCategory getCategory() { - return category; - } + public EmailCategory getCategory() { return category; } + + public List getSpecificLicenses() { return specificLicenses; } public String getDropdownKey() { return dropdownKey; } + public boolean isNotModalEmail() { return notModalEmail; } + public Optional getModalTitle() { return modalTitle; }