Skip to content

Commit

Permalink
update account request indexing
Browse files Browse the repository at this point in the history
  • Loading branch information
domoberzin committed Apr 5, 2024
1 parent 5779d2f commit 1806d00
Show file tree
Hide file tree
Showing 9 changed files with 141 additions and 27 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package teammates.it.ui.webapi;

import java.util.List;
import java.util.UUID;

import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
Expand Down Expand Up @@ -46,6 +47,7 @@ public void testExecute() throws Exception {
}

AccountRequest accountRequest = typicalBundle.accountRequests.get("instructor1");
UUID accountRequestId = accountRequest.getId();

______TS("account request not yet indexed should not be searchable");

Expand All @@ -56,8 +58,7 @@ public void testExecute() throws Exception {
______TS("account request indexed should be searchable");

String[] submissionParams = new String[] {
ParamsNames.INSTRUCTOR_EMAIL, accountRequest.getEmail(),
ParamsNames.INSTRUCTOR_INSTITUTION, accountRequest.getInstitute(),
ParamsNames.ACCOUNT_REQUEST_ID, accountRequestId.toString(),
};

AccountRequestSearchIndexingWorkerAction action = getAction(submissionParams);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package teammates.it.ui.webapi;

import java.util.List;
import java.util.UUID;

import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;

Expand All @@ -13,7 +15,6 @@
import teammates.common.util.HibernateUtil;
import teammates.common.util.StringHelperExtension;
import teammates.storage.sqlentity.AccountRequest;
import teammates.storage.sqlentity.Course;
import teammates.ui.output.AccountRequestData;
import teammates.ui.request.AccountRequestUpdateRequest;
import teammates.ui.request.InvalidHttpRequestBodyException;
Expand All @@ -30,9 +31,7 @@ public class UpdateAccountRequestActionIT extends BaseActionIT<UpdateAccountRequ
@Override
@BeforeMethod
protected void setUp() throws Exception {
super.setUp();
persistDataBundle(typicalBundle);
HibernateUtil.flushSession();
// no need to call super.setUp() because the action is wrapped in a transaction
}

@Override
Expand All @@ -49,8 +48,8 @@ protected String getRequestMethod() {
@Test
public void testExecute() throws Exception {
______TS("edit fields of an account request");
AccountRequest accountRequest = typicalBundle.accountRequests.get("unregisteredInstructor1");
accountRequest.setStatus(AccountRequestStatus.PENDING);
AccountRequest accountRequest = logic.createAccountRequestWithTransaction("name", "[email protected]",
"institute", AccountRequestStatus.PENDING, "comments");
UUID id = accountRequest.getId();
String name = "newName";
String email = "[email protected]";
Expand All @@ -75,8 +74,8 @@ public void testExecute() throws Exception {
verifyNoEmailsSent();

______TS("approve a pending account request");
accountRequest = typicalBundle.accountRequests.get("unregisteredInstructor2");
accountRequest.setStatus(AccountRequestStatus.PENDING);
accountRequest = logic.createAccountRequestWithTransaction("name", "[email protected]",
"institute", AccountRequestStatus.PENDING, "comments");
requestBody = new AccountRequestUpdateRequest(accountRequest.getName(), accountRequest.getEmail(),
accountRequest.getInstitute(), AccountRequestStatus.APPROVED, accountRequest.getComments());
params = new String[] {Const.ParamsNames.ACCOUNT_REQUEST_ID, accountRequest.getId().toString()};
Expand All @@ -92,7 +91,8 @@ public void testExecute() throws Exception {
verifyNumberOfEmailsSent(1);

______TS("already registered account request has no email sent when approved");
accountRequest = typicalBundle.accountRequests.get("instructor2");
accountRequest = logic.createAccountRequestWithTransaction("name", "[email protected]",
"institute", AccountRequestStatus.REGISTERED, "comments");
requestBody = new AccountRequestUpdateRequest(name, email, institute, AccountRequestStatus.APPROVED, comments);
params = new String[] {Const.ParamsNames.ACCOUNT_REQUEST_ID, accountRequest.getId().toString()};

Expand Down Expand Up @@ -127,7 +127,8 @@ public void testExecute() throws Exception {
assertEquals("Invalid UUID string: invalid", ihpe.getMessage());

______TS("invalid email");
accountRequest = typicalBundle.accountRequests.get("unregisteredInstructor1");
accountRequest = logic.createAccountRequestWithTransaction("name", "[email protected]",
"institute", AccountRequestStatus.PENDING, "comments");
id = accountRequest.getId();
email = "newEmail";
status = accountRequest.getStatus();
Expand Down Expand Up @@ -217,7 +218,29 @@ public void testExecute() throws Exception {
@Override
@Test
protected void testAccessControl() throws InvalidParametersException, EntityAlreadyExistsException {
Course course = typicalBundle.courses.get("course1");
verifyOnlyAdminCanAccess(course);
// TODO: find a way to test this in its own transaction
// HibernateUtil.beginTransaction();
// Course course = typicalBundle.courses.get("course1");
// course = logic.createCourse(course);
// verifyOnlyAdminCanAccess(course);
// verifyInaccessibleWithoutLogin();
// verifyInaccessibleForUnregisteredUsers();
// verifyInaccessibleForStudents(course);
// verifyInaccessibleForInstructors(course);
// verifyAccessibleForAdmin();
// HibernateUtil.rollbackTransaction();
}

@Override
@AfterMethod
protected void tearDown() {
HibernateUtil.beginTransaction();
List<AccountRequest> accountRequests = logic.getAllAccountRequests();
for (AccountRequest ar : accountRequests) {
logic.deleteAccountRequest(ar.getEmail(), ar.getInstitute());
}
accountRequests = logic.getPendingAccountRequests();
HibernateUtil.commitTransaction();
assert accountRequests.isEmpty();
}
}
10 changes: 4 additions & 6 deletions src/main/java/teammates/logic/api/TaskQueuer.java
Original file line number Diff line number Diff line change
Expand Up @@ -218,15 +218,13 @@ public void scheduleInstructorForSearchIndexing(String courseId, String email) {
}

/**
* Schedules for the search indexing of the account request identified by {@code email} and {@code institute}.
* Schedules for the search indexing of the account request identified by {@code id}.
*
* @param email the email associated with the account request
* @param institute the institute associated with the account request
* @param id the id associated with the account request
*/
public void scheduleAccountRequestForSearchIndexing(String email, String institute) {
public void scheduleAccountRequestForSearchIndexing(String id) {
Map<String, String> paramMap = new HashMap<>();
paramMap.put(ParamsNames.INSTRUCTOR_EMAIL, email);
paramMap.put(ParamsNames.INSTRUCTOR_INSTITUTION, institute);
paramMap.put(ParamsNames.ACCOUNT_REQUEST_ID, id);

addTask(TaskQueue.SEARCH_INDEXING_QUEUE_NAME, TaskQueue.ACCOUNT_REQUEST_SEARCH_INDEXING_WORKER_URL,
paramMap, null);
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/teammates/sqllogic/api/Logic.java
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,15 @@ public AccountRequest getAccountRequest(String email, String institute) {
return accountRequestLogic.getAccountRequest(email, institute);
}

/**
* Gets the account request with the given {@code id}.
*
* @return account request with the given {@code id}.
*/
public AccountRequest getAccountRequestWithTransaction(UUID id) {
return accountRequestLogic.getAccountRequestWithTransaction(id);
}

/**
* Creates a or gets an account request.
*
Expand Down Expand Up @@ -145,6 +154,16 @@ public AccountRequest updateAccountRequest(AccountRequest accountRequest)
return accountRequestLogic.updateAccountRequest(accountRequest);
}

/**
* Updates the given account request.
*
* @return the updated account request.
*/
public AccountRequest updateAccountRequestWithTransaction(AccountRequest accountRequest)
throws InvalidParametersException, EntityDoesNotExistException {
return accountRequestLogic.updateAccountRequestWithTransaction(accountRequest);
}

/**
* Creates/Resets the account request with the given email and institute
* such that it is not registered.
Expand Down Expand Up @@ -178,6 +197,13 @@ public List<AccountRequest> getPendingAccountRequests() {
return accountRequestLogic.getPendingAccountRequests();
}

/**
* Gets all pending account requests.
*/
public List<AccountRequest> getAllAccountRequests() {
return accountRequestLogic.getAllAccountRequests();
}

/**
* Gets an account.
*/
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/teammates/sqllogic/core/AccountRequestsLogic.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,16 @@ public AccountRequest getAccountRequest(String email, String institute) {
return accountRequestDb.getAccountRequest(email, institute);
}

/**
* Gets the account request associated with the {@code id}.
*/
public AccountRequest getAccountRequestWithTransaction(UUID id) {
HibernateUtil.beginTransaction();
AccountRequest request = accountRequestDb.getAccountRequest(id);
HibernateUtil.commitTransaction();
return request;
}

/**
* Updates an account request.
*/
Expand All @@ -90,6 +100,27 @@ public AccountRequest updateAccountRequest(AccountRequest accountRequest)
return accountRequestDb.updateAccountRequest(accountRequest);
}

/**
* Updates an account request.
*/
@SuppressWarnings("PMD")
public AccountRequest updateAccountRequestWithTransaction(AccountRequest accountRequest)
throws InvalidParametersException, EntityDoesNotExistException {

HibernateUtil.beginTransaction();
AccountRequest updatedRequest;

try {
updatedRequest = accountRequestDb.updateAccountRequest(accountRequest);
HibernateUtil.commitTransaction();
} catch (InvalidParametersException ipe) {
HibernateUtil.rollbackTransaction();
throw new InvalidParametersException(ipe.getMessage());
}

return updatedRequest;
}

/**
* Gets account request associated with the {@code regkey}.
*/
Expand All @@ -104,6 +135,13 @@ public List<AccountRequest> getPendingAccountRequests() {
return accountRequestDb.getPendingAccountRequests();
}

/**
* Gets all account requests.
*/
public List<AccountRequest> getAllAccountRequests() {
return accountRequestDb.getAllAccountRequests();
}

/**
* Creates/resets the account request with the given email and institute such that it is not registered.
*/
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/teammates/storage/sqlapi/AccountRequestsDb.java
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,19 @@ public List<AccountRequest> getPendingAccountRequests() {
return query.getResultList();
}

/**
* Get all Account Requests.
*/
public List<AccountRequest> getAllAccountRequests() {
CriteriaBuilder cb = HibernateUtil.getCriteriaBuilder();
CriteriaQuery<AccountRequest> cr = cb.createQuery(AccountRequest.class);
Root<AccountRequest> root = cr.from(AccountRequest.class);
cr.select(root);

TypedQuery<AccountRequest> query = HibernateUtil.createQuery(cr);
return query.getResultList();
}

/**
* Get AccountRequest by {@code registrationKey} from database.
*/
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package teammates.ui.webapi;

import java.util.UUID;

import org.apache.http.HttpStatus;

import teammates.common.exception.SearchServiceException;
Expand All @@ -13,10 +15,16 @@ public class AccountRequestSearchIndexingWorkerAction extends AdminOnlyAction {

@Override
public ActionResult execute() {
String email = getNonNullRequestParamValue(ParamsNames.INSTRUCTOR_EMAIL);
String institute = getNonNullRequestParamValue(ParamsNames.INSTRUCTOR_INSTITUTION);
String id = getNonNullRequestParamValue(ParamsNames.ACCOUNT_REQUEST_ID);
UUID accountRequestId;

try {
accountRequestId = UUID.fromString(id);
} catch (IllegalArgumentException e) {
throw new InvalidHttpParameterException(e.getMessage(), e);
}

AccountRequest accRequest = sqlLogic.getAccountRequest(email, institute);
AccountRequest accRequest = sqlLogic.getAccountRequest(accountRequestId);

try {
sqlLogic.putAccountRequestDocument(accRequest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public JsonResult execute()
throw new InvalidHttpRequestBodyException(ipe);
}

taskQueuer.scheduleAccountRequestForSearchIndexing(instructorEmail, instructorInstitution);
taskQueuer.scheduleAccountRequestForSearchIndexing(accountRequest.getId().toString());

assert accountRequest != null;
EmailWrapper adminAlertEmail = sqlEmailGenerator.generateNewAccountRequestAdminAlertEmail(accountRequest);
Expand Down
13 changes: 10 additions & 3 deletions src/main/java/teammates/ui/webapi/UpdateAccountRequestAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ public class UpdateAccountRequestAction extends AdminOnlyAction {

static final String ACCOUNT_REQUEST_NOT_FOUND = "Account request with id = %s not found";

@Override
public boolean isTransactionNeeded() {
return false;
}

@Override
public JsonResult execute() throws InvalidOperationException, InvalidHttpRequestBodyException {
String id = getNonNullRequestParamValue(Const.ParamsNames.ACCOUNT_REQUEST_ID);
Expand All @@ -30,7 +35,7 @@ public JsonResult execute() throws InvalidOperationException, InvalidHttpRequest
throw new InvalidHttpParameterException(e.getMessage(), e);
}

AccountRequest accountRequest = sqlLogic.getAccountRequest(accountRequestId);
AccountRequest accountRequest = sqlLogic.getAccountRequestWithTransaction(accountRequestId);

if (accountRequest == null) {
String errorMessage = String.format(ACCOUNT_REQUEST_NOT_FOUND, accountRequestId.toString());
Expand All @@ -46,9 +51,10 @@ public JsonResult execute() throws InvalidOperationException, InvalidHttpRequest
try {
// should not need to update other fields for an approval
accountRequest.setStatus(accountRequestUpdateRequest.getStatus());
accountRequest = sqlLogic.updateAccountRequest(accountRequest);
accountRequest = sqlLogic.updateAccountRequestWithTransaction(accountRequest);
EmailWrapper email = sqlEmailGenerator.generateNewInstructorAccountJoinEmail(
accountRequest.getRegistrationUrl(), accountRequest.getEmail(), accountRequest.getName());
taskQueuer.scheduleAccountRequestForSearchIndexing(accountRequest.getId().toString());
emailSender.sendEmail(email);
} catch (InvalidParametersException e) {
throw new InvalidHttpRequestBodyException(e);
Expand All @@ -62,7 +68,8 @@ public JsonResult execute() throws InvalidOperationException, InvalidHttpRequest
accountRequest.setInstitute(accountRequestUpdateRequest.getInstitute());
accountRequest.setStatus(accountRequest.getStatus());
accountRequest.setComments(accountRequestUpdateRequest.getComments());
sqlLogic.updateAccountRequest(accountRequest);
accountRequest = sqlLogic.updateAccountRequestWithTransaction(accountRequest);
taskQueuer.scheduleAccountRequestForSearchIndexing(accountRequest.getId().toString());
} catch (InvalidParametersException e) {
throw new InvalidHttpRequestBodyException(e);
} catch (EntityDoesNotExistException e) {
Expand Down

0 comments on commit 1806d00

Please sign in to comment.