import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProvider;
import com.amazonaws.services.cognitoidp.AWSCognitoIdentityProviderClientBuilder;
import com.amazonaws.services.cognitoidp.model.*;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClientBuilder;
import com.amazonaws.services.simpleemail.model.Body;
import com.amazonaws.services.simpleemail.model.Content;
import com.amazonaws.services.simpleemail.model.Destination;
import com.amazonaws.services.simpleemail.model.Message;
import com.amazonaws.services.simpleemail.model.SendEmailRequest;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class UserDeleter implements CallHandler {
private Connection connection;
private String cognitoID;
static final String DELETION_EMAIL_FROM = "merzn@purdue.edu";
static final String CONFIGSET = "ConfigSet";
static final String DELETION_EMAIL_SUBJECT = "Listify Account Deletion Confirmation";
static final String HTMLBODY = "
We're sad to see you go!
"
+ " This email is to confirm your Listify account has been deleted. If you have any questions"
+ " or did not request this action, please reply to this email. Thank you for being a Listify"
+ " user and best of luck in your other endeavours!"
+ "
"
+ "
- The Listify Team";
static final String TEXTBODY = "This email is to confirm your Listify account has been deleted. If you have any questions"
+ " or did not request this action, please reply to this email. Thank you for being a Listify"
+ " user and best of luck in your other endeavours! - The Listify Team";
private final String GET_LISTS = "SELECT * FROM List WHERE (owner = ?);";
private final String DELETE_LIST_PRODUCT = "DELETE FROM ListProduct WHERE (listID = ?);";
private final String DELETE_LISTS = "DELETE FROM List WHERE (owner = ?);";
private final String DELETE_LIST_SHARES = "DELETE FROM ListSharee WHERE (listID = ?);";
private final String DELETE_LIST_ACCESS = "DELETE FROM ListSharee WHERE (userID = ?);";
private final String DELETE_PROFILE_PICTURE = "DELETE FROM Pictures WHERE (cognitoID = ?);";
public UserDeleter(Connection connection, String cognitoID) {
this.connection = connection;
this.cognitoID = cognitoID;
}
public Object conductAction(Map bodyMap, HashMap queryString, String cognitoID) throws SQLException {
AWSCognitoIdentityProvider awsCognitoIdentityProvider = AWSCognitoIdentityProviderClientBuilder.defaultClient();
Properties cognitoProperties;
try {
cognitoProperties = DBConnector.loadProperties("cognitoProperties.json");
} catch (IOException e) {
e.printStackTrace();
return null;
}
String userPoolId = cognitoProperties.get("userPoolId").toString();
System.out.println(userPoolId);
ListUsersRequest checkRequest = new ListUsersRequest().withUserPoolId(userPoolId);
checkRequest.setFilter("sub=\"" + cognitoID +"\"");
ListUsersResult foundUsersResult = awsCognitoIdentityProvider.listUsers(checkRequest);
List foundUsers = foundUsersResult.getUsers();
if (foundUsers.size() != 1) {
System.out.println(foundUsers);
if (foundUsers.size() == 0) {
throw new InputMismatchException("No user with given sub");
}
throw new InputMismatchException("Found more than one user with supposedly unique sub");
}
UserType foundUser = foundUsers.get(0);
System.out.println(foundUser.getAttributes());
String email = "";
for (AttributeType attribute : foundUser.getAttributes()) {
if (attribute.getName().equals("email")) {
email = attribute.getValue();
break;
}
System.out.println(attribute.getName() + ": " + attribute.getValue());
}
AdminUserGlobalSignOutRequest adminUserGlobalSignOutRequest = new AdminUserGlobalSignOutRequest().withUserPoolId(userPoolId);
adminUserGlobalSignOutRequest.setUsername(cognitoID);
System.out.println(adminUserGlobalSignOutRequest);
awsCognitoIdentityProvider.adminUserGlobalSignOut(adminUserGlobalSignOutRequest);
AdminDeleteUserRequest adminDeleteUserRequest = new AdminDeleteUserRequest().withUserPoolId(userPoolId);
adminDeleteUserRequest.setUsername(cognitoID);
System.out.println(adminDeleteUserRequest);
awsCognitoIdentityProvider.adminDeleteUser(adminDeleteUserRequest);
AmazonSimpleEmailService client =
AmazonSimpleEmailServiceClientBuilder.standard()
.withRegion(Regions.US_EAST_2).build();
SendEmailRequest request = new SendEmailRequest()
.withDestination(
new Destination().withToAddresses(email))
.withMessage(new Message()
.withBody(new Body()
.withHtml(new Content()
.withCharset("UTF-8").withData(HTMLBODY))
.withText(new Content()
.withCharset("UTF-8").withData(TEXTBODY)))
.withSubject(new Content()
.withCharset("UTF-8").withData(DELETION_EMAIL_SUBJECT)))
.withSource(DELETION_EMAIL_FROM);
client.sendEmail(request);
PreparedStatement statement = connection.prepareStatement(GET_LISTS);
statement.setString(1, cognitoID);
System.out.println(statement);
ResultSet userLists = statement.executeQuery();
while (userLists.next()) {
int listID = userLists.getInt("listID");
statement = connection.prepareStatement(DELETE_LIST_PRODUCT);
statement.setInt(1, listID);
System.out.println(statement);
statement.executeUpdate();
statement = connection.prepareStatement(DELETE_LIST_SHARES);
statement.setInt(1, listID);
System.out.println(statement);
statement.executeUpdate();
}
statement = connection.prepareStatement(DELETE_LISTS);
statement.setString(1, cognitoID);
System.out.println(statement);
statement.executeUpdate();
statement = connection.prepareStatement(DELETE_LIST_ACCESS);
statement.setString(1, cognitoID);
System.out.println(statement);
statement.executeUpdate();
statement = connection.prepareStatement(DELETE_PROFILE_PICTURE);
statement.setString(1, cognitoID);
System.out.println(statement);
statement.executeUpdate();
connection.commit();
return null;
}
}