Procházet zdrojové kódy

MOD: fix api bugs and merge from master

liuzicong před 8 roky
rodič
revize
8338a74f54

+ 19 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/Task2AssistantManagerDao.java

@@ -0,0 +1,19 @@
+package cn.iselab.mooctest.site.dao;
+
+import cn.iselab.mooctest.site.models.MobileVerification;
+import cn.iselab.mooctest.site.models.Task2AssistantManager;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.List;
+
+/**
+ * Created by Liu on 2016/12/27.
+ */
+@Transactional
+public interface Task2AssistantManagerDao extends CrudRepository<MobileVerification, Long> {
+    @Query("SELECT t2a FROM Task2AssistantManager t2a WHERE t2a.taskId = :taskId")
+    List<Task2AssistantManager> findByTaskId(@Param("taskId") long taskId);
+}

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/WorkerDao.java

@@ -20,8 +20,8 @@ public interface WorkerDao extends PagingAndSortingRepository<Worker, Long> {
 
     List<Worker> findByName(@Param("name") String name);
 
-    @Query("SELECT w FROM Worker w WHERE w.email = :account OR w.mobile = :account")
-    Worker findByAccount(@Param("account") String email);
+    @Query("SELECT w FROM Worker w WHERE w.email = :account OR w.mobile = :mobile")
+    Worker findByAccount(@Param("email") String email, @Param("mobile") String mobile);
 
     /**
      * get workerList of certain group order by workerId desc

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/ApiService.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.service.application;
 
+import cn.iselab.mooctest.site.models.Task;
 import cn.iselab.mooctest.site.models.Worker;
 
 /**
@@ -28,12 +29,18 @@ public interface ApiService {
 
     boolean joinGroup(Long workerId, Long groupId, String managerName);
 
+    boolean addScores(String host, Long taskId, Long[] workerIds, Double[] scores, String[] resultUrls, String[] pickeds);
+
     boolean addScore(Long workerId, Long taskId, Double score, String resultUrl, String picked, String host);
 
     String checkCaseAssignment(Long workerId, String subsiteCaseId, Long taskId, String host);
 
+    String[] checkCaseAssignments(Long[] workerIds, String subsiteCaseId, Long taskId, String host);
+
     String checkCaseExists(Long workerId, String subsiteCaseId, Long taskId, String host);
 
+    String checkCaseExists(Long[] workerIds, String subsiteCaseId, Long taskId, String host);
+
     String uploadApp(String host, String name, String caseUrl, Boolean isPublic, Long uploaderId);
 
     String addCase(String host, String caseId, String typeName, Long managerId, String name, String url, String description, Integer domain, boolean isPublic);
@@ -46,4 +53,8 @@ public interface ApiService {
     String checkCaseAvailability(Long taskId, String subsiteCaseId, String host);
 
     String booleanToJSON(boolean b);
+
+    Task getTask(Long taskId);
+
+    String getManagerJson(Task task);
 }

+ 203 - 116
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/impl/ApiServiceImpl.java

@@ -6,7 +6,6 @@ import cn.iselab.mooctest.site.common.constant.SubsiteConstants;
 import cn.iselab.mooctest.site.dao.*;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.application.ApiService;
-import org.apache.commons.lang3.StringUtils;
 import org.json.JSONArray;
 import org.json.JSONObject;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,14 +43,11 @@ public class ApiServiceImpl implements ApiService {
     private AppDao appDao;
     @Autowired
     private SubjectDao subjectDao;
-
-    private static long generateCase(List<Long> caseIdsList) {
-        int serial = new Double(Math.floor(Math.random() * caseIdsList.size()))
-                .intValue();
-        return caseIdsList.get(serial);
-    }
+    @Autowired
+    private Task2AssistantManagerDao task2AssistantManagerDao;
 
     /**
+     *
      * GET methods
      */
     @Override
@@ -69,11 +65,12 @@ public class ApiServiceImpl implements ApiService {
             }
         }
         List<AssignedTask> assignedTasks = new ArrayList<AssignedTask>();
-        if (groupId == null) {
+        if (groupId == null){
             assignedTasks = assignedTaskDao.findByWorkerId(workerId);
-        } else {
+        }
+        else{
             List<Task2Group> task2Groups = task2GroupDao.findByGroupId(groupId);
-            for (Task2Group task2Group : task2Groups) {
+            for (Task2Group task2Group : task2Groups){
                 Task taskInGroup = taskDao.findOne(task2Group.getTaskId());
                 assignedTasks.add(assignedTaskDao.findByTaskIdAndWorkerId(taskInGroup.getId(), workerId));
             }
@@ -81,13 +78,13 @@ public class ApiServiceImpl implements ApiService {
 
         // generate output JSON
         JSONArray resultArr = new JSONArray();
-        for (AssignedTask assignedTask : assignedTasks) {
+        for (AssignedTask assignedTask : assignedTasks){
             JSONObject resultObj = new JSONObject();
             Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
             Subsite subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
             Manager managerOfTask = managerDao.findOne(taskAssigned.getManagerId());
 
-            if (subsiteAssigned.getId() != subsite.getId()) {
+            if (subsiteAssigned.getId() != subsite.getId()){
                 continue;
             }
             resultObj.put("name", taskAssigned.getName());
@@ -99,7 +96,7 @@ public class ApiServiceImpl implements ApiService {
 
             JSONArray groupArr = new JSONArray();
             List<Task2Group> task2Groups = task2GroupDao.findByTaskId(taskAssigned.getId());
-            for (Task2Group task2Group : task2Groups) {
+            for (Task2Group task2Group : task2Groups){
                 Group groupInTask = groupDao.findOne(task2Group.getGroupId());
                 groupArr.put(groupInTask.getName());
             }
@@ -117,7 +114,7 @@ public class ApiServiceImpl implements ApiService {
         Task task = taskDao.findOne(taskId);
         Worker worker = workerDao.findOne(workerId);
 
-        if (task == null || worker == null) {
+        if (task == null || worker == null){
             return "";
         }
         Manager managerOfTask = managerDao.findOne(task.getManagerId());
@@ -132,8 +129,8 @@ public class ApiServiceImpl implements ApiService {
         result.put("managerId", managerOfTask.getId());
         JSONArray groupArr = new JSONArray();
         List<Task2Group> task2Groups = task2GroupDao.findByTaskId(taskId);
-        if (task2Groups != null) {
-            for (Task2Group task2Group : task2Groups) {
+        if (task2Groups != null){
+            for (Task2Group task2Group : task2Groups){
                 Group groupInTask = groupDao.findOne(task2Group.getGroupId());
                 groupArr.put(groupInTask.getName());
             }
@@ -141,7 +138,7 @@ public class ApiServiceImpl implements ApiService {
         result.put("groups", groupArr);
 
         AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
-        if (assignedTask == null) {
+        if (assignedTask == null){
             return "";
         }
         JSONArray caseListArr = new JSONArray();
@@ -153,7 +150,7 @@ public class ApiServiceImpl implements ApiService {
         JSONObject contentObj = new JSONObject(assignedTask.getContent());
         JSONObject casesObj = contentObj.getJSONObject("cases");
         Set<String> keySet = casesObj.keySet();
-        for (String key : keySet) {
+        for (String key : keySet){
             subsiteCaseIds.add(key);
             JSONObject caseObj = new JSONObject();
             caseObj.put("id", key);
@@ -164,9 +161,9 @@ public class ApiServiceImpl implements ApiService {
         // check if there are any cases which are not assigned(need to be picked by workers themselves)
         Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
         List<Task2Case> task2Cases = task2CaseDao.findByTaskId(taskAssigned.getId());
-        for (Task2Case task2Case : task2Cases) {
+        for (Task2Case task2Case : task2Cases){
             Case cazeInTask = caseDao.findOne(task2Case.getId());
-            if ((!task2Case.isAutoSelect()) && (!subsiteCaseIds.contains(cazeInTask.getCaseId()))) {
+            if ((!task2Case.isAutoSelect()) && (!subsiteCaseIds.contains(cazeInTask.getCaseId()))){
 
                 Case caze = caseDao.findOne(task2Case.getCaseId());
                 subsiteCaseIds.add(caze.getCaseId());
@@ -187,7 +184,7 @@ public class ApiServiceImpl implements ApiService {
         JSONObject result = new JSONObject();
 
         Task task = taskDao.findOne(taskId);
-        if (task == null) {
+        if (task == null){
             return "";
         }
         result.put("id", task.getId());
@@ -197,13 +194,14 @@ public class ApiServiceImpl implements ApiService {
         return result.toString();
     }
 
+
     @Override
     public String getCases(Long workerId) {
         JSONArray result = new JSONArray();
 
         List<AssignedTask> assignedTasks = assignedTaskDao.findByWorkerId(workerId);
         Set<String> outputCaseIds = new HashSet<String>();
-        for (AssignedTask assignedTask : assignedTasks) {
+        for (AssignedTask assignedTask : assignedTasks){
             Task taskAssigned = taskDao.findOne(assignedTask.getTaskId());
             Subsite subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
             if (subsiteAssigned.getId() != SubsiteConstants.KIKBUG_SUBSITE_ID && subsiteAssigned.getId() != SubsiteConstants.KIJAM_SUBSITE_ID) {
@@ -212,7 +210,7 @@ public class ApiServiceImpl implements ApiService {
             JSONObject contentObj = new JSONObject(assignedTask.getContent());
             JSONObject casesObj = contentObj.getJSONObject("cases");
             Set<String> keySet = casesObj.keySet();
-            for (String key : keySet) {
+            for (String key : keySet){
                 outputCaseIds.add(key);
                 JSONObject caseObj = new JSONObject();
                 caseObj.put("caseId", key);
@@ -222,14 +220,14 @@ public class ApiServiceImpl implements ApiService {
             }
 
             List<Task2Case> task2Cases = task2CaseDao.findByTaskId(assignedTask.getTaskId());
-            for (Task2Case task2Case : task2Cases) {
+            for (Task2Case task2Case : task2Cases){
                 taskAssigned = taskDao.findOne(assignedTask.getTaskId());
                 subsiteAssigned = subsiteDao.findOne(taskAssigned.getSubsiteId());
-                if (subsiteAssigned.getId() != SubsiteConstants.KIKBUG_SUBSITE_ID || subsiteAssigned.getId() != SubsiteConstants.KIJAM_SUBSITE_ID) {
+                if (subsiteAssigned.getId() != SubsiteConstants.KIKBUG_SUBSITE_ID || subsiteAssigned.getId() != SubsiteConstants.KIJAM_SUBSITE_ID){
                     continue;
                 }
                 Case cazeInTask = caseDao.findOne(task2Case.getCaseId());
-                if (!task2Case.isAutoSelect() && (!outputCaseIds.contains(cazeInTask.getCaseId()))) {
+                if (!task2Case.isAutoSelect() && (!outputCaseIds.contains(cazeInTask.getCaseId()))){
                     outputCaseIds.add(cazeInTask.getCaseId());
                     JSONObject caseObj = new JSONObject();
                     caseObj.put("caseId", cazeInTask.getCaseId());
@@ -244,8 +242,11 @@ public class ApiServiceImpl implements ApiService {
         return result.toString();
     }
 
+
     /**
+     *
      * POST methods
+     *
      */
     @Override
     public boolean verifyApp(Long appId, String url) {
@@ -265,18 +266,18 @@ public class ApiServiceImpl implements ApiService {
 
         Group group = groupDao.findOne(groupId);
         // check privilege
-        if (groupId != PrivilegeConstants.SUPER_GROUP_ID) {
-            if (privilegeExpired(managerDao.findOne(group.getManagerId())) || groupMemberExceeded(group)) {
+        if (groupId != PrivilegeConstants.SUPER_GROUP_ID){
+            if (privilegeExpired(managerDao.findOne(group.getManagerId())) || groupMemberExceeded(group)){
                 return false;
             }
         }
         if (group != null) {
             Worker worker = workerDao.findOne(workerId);
             Manager manager = managerDao.findOne(group.getManagerId());
-            if (!manager.getName().equals(managerName)) {
+            if (!manager.getName().equals(managerName)){
                 return false;
             }
-            if (group2WorkerDao.findByWorkerIdAndGroupId(workerId, groupId) != null) {
+            if (group2WorkerDao.findByWorkerIdAndGroupId(workerId, groupId) != null){
                 return false;
             }
             group2Worker.setWorkerId(worker.getId());
@@ -292,58 +293,79 @@ public class ApiServiceImpl implements ApiService {
     }
 
     @Override
-    public boolean addScore(Long workerId, Long taskId, Double score, String resultUrl, String picked, String host) {
-        JSONObject caseContentObj = new JSONObject(picked);
-        AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
+    public boolean addScores(String host, Long taskId, Long[] workerIds, Double[] scores, String[] resultUrls, String[] pickeds){
+        for (int idx = 0 ; idx < workerIds.length ; idx ++){
+            String picked = pickeds[idx];
+            double score = scores[idx];
+            long workerId = workerIds[idx];
+            String resultUrl = resultUrls[idx];
+
+            JSONObject caseContentObj = new JSONObject(picked);
+            AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
+
+            JSONObject results = new JSONObject(assignedTask.getResult());
+            JSONObject resultObj = results.getJSONObject("results");
+
+            String subsiteCaseId = caseContentObj.getString("caseId");
+
+            double weight = caseContentObj.getDouble("weight");
+            JSONObject caseResultObj = new JSONObject();
+            JSONArray caseScoreArr = new JSONArray(), caseResultUrlArr = new JSONArray();
+            double maxScore = score;
+            if (resultObj.has(String.valueOf(subsiteCaseId))){
 
-        JSONObject results = new JSONObject(assignedTask.getResult());
-        JSONObject resultObj = results.getJSONObject("results");
-
-        String subsiteCaseId = caseContentObj.getString("caseId");
-
-        double weight = caseContentObj.getDouble("weight");
-        JSONObject caseResultObj = new JSONObject();
-        JSONArray caseScoreArr = new JSONArray(), caseResultUrlArr = new JSONArray();
-        double maxScore = score;
-        if (resultObj.has(String.valueOf(subsiteCaseId))) {
-
-            caseResultObj = resultObj.getJSONObject(String.valueOf(subsiteCaseId));
-            caseScoreArr = caseResultObj.getJSONArray("scores");
-            caseResultUrlArr = caseResultObj.getJSONArray("resultUrls");
-            maxScore = Math.max(caseResultObj.getDouble("maxScore"), score);
-        } else {
-            caseResultObj.put("id", caseContentObj.getLong("id"));
-            caseResultObj.put("name", caseContentObj.getString("name"));
-            caseResultObj.put("weight", caseContentObj.getDouble("weight"));
-        }
-        caseScoreArr.put(score);
-        caseResultObj.put("scores", caseScoreArr);
-        caseResultUrlArr.put(resultUrl);
-        caseResultObj.put("resultUrls", caseResultUrlArr);
-        caseResultObj.put("maxScore", maxScore);
-
-        // update resultObj
-        resultObj.put(String.valueOf(subsiteCaseId), caseResultObj);
-        results.put("results", resultObj);
-
-        // update assignedTask score
-        assignedTask.setScore(score);
-        assignedTask.setResult(results.toString());
-        assignedTaskDao.save(assignedTask);
+                caseResultObj = resultObj.getJSONObject(String.valueOf(subsiteCaseId));
+                caseScoreArr = caseResultObj.getJSONArray("scores");
+                caseResultUrlArr = caseResultObj.getJSONArray("resultUrls");
+                maxScore = Math.max(maxScore, caseResultObj.getDouble("maxScore"));
+
+            }
+            else{
+                caseResultObj.put("id", caseContentObj.getLong("id"));
+                caseResultObj.put("name", caseContentObj.getString("name"));
+                caseResultObj.put("weight", caseContentObj.getDouble("weight"));
+            }
+            caseScoreArr.put(score);
+            caseResultObj.put("scores", caseScoreArr);
+            caseResultUrlArr.put(resultUrl);
+            caseResultObj.put("resultUrls", caseResultUrlArr);
+            caseResultObj.put("maxScore", maxScore);
+
+            // update resultObj
+            resultObj.put(String.valueOf(subsiteCaseId), caseResultObj);
+            results.put("results", resultObj);
+
+            // update assignedTask score
+            assignedTask.setScore(score);
+            assignedTask.setResult(results.toString());
+            assignedTaskDao.save(assignedTask);
+        }
 
         return true;
+
+    }
+
+    @Override
+    public  boolean addScore(Long workerId, Long taskId, Double score,
+                                   String resultUrl, String picked, String host) {
+        Long[] workerIds = {workerId};
+        String[] pickeds = {picked};
+        String[] resultUrls = {resultUrl};
+        Double[] scores = {score};
+
+        return addScores(host, taskId, workerIds, scores, resultUrls, pickeds);
     }
 
     @Override
     public String uploadApp(String host, String name, String caseUrl, Boolean isPublic, Long uploaderId) {
         String message = "";
         Subsite subsite = subsiteDao.findByBaseUrl(host);
-        if (subsite == null) {
+        if (subsite == null){
             return "No subsite match from host";
         }
 
         Manager uploader = managerDao.findById(uploaderId);
-        if (uploader == null) {
+        if (uploader == null){
             return "No such manager";
         }
 
@@ -367,13 +389,13 @@ public class ApiServiceImpl implements ApiService {
         App app = appDao.findOne(appId);
 
         Subsite subsite = subsiteDao.findByBaseUrl(host);
-        if (subsite == null) {
+        if (subsite == null){
             return "No subsite match from host";
         }
         description = (description == null) ? "" : description;
 
         Subject subject = subjectDao.findBySubsiteIdAndTypeName(subsite.getId(), typeName);
-        if (subject == null) {
+        if (subject == null){
             subject = new Subject();
             subject.setName(typeName);
             subject.setTargetUrl("");
@@ -383,7 +405,7 @@ public class ApiServiceImpl implements ApiService {
         }
 
         Case oldCase = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), caseId);
-        if (oldCase != null) {
+        if (oldCase != null){
             return "case already exists";
         }
 
@@ -408,14 +430,14 @@ public class ApiServiceImpl implements ApiService {
         String message = "";
 
         Subsite subsite = subsiteDao.findByBaseUrl(host);
-        if (subsite == null) {
+        if (subsite == null){
             return "No subsite match from host";
         }
-        Manager manager = (managerId == null) ? null : managerDao.findById(managerId);
+        Manager manager = (managerId == null) ?  null : managerDao.findById(managerId);
         description = (description == null) ? "" : description;
 
         Subject subject = subjectDao.findBySubsiteIdAndTypeName(subsite.getId(), typeName);
-        if (subject == null) {
+        if (subject == null){
             subject = new Subject();
             subject.setName(typeName);
             subject.setTargetUrl("");
@@ -425,7 +447,7 @@ public class ApiServiceImpl implements ApiService {
         }
 
         Case oldCase = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), caseId);
-        if (oldCase != null) {
+        if (oldCase != null){
             return "case already exists";
         }
 
@@ -445,6 +467,7 @@ public class ApiServiceImpl implements ApiService {
         return message;
     }
 
+
     @Override
     public String takeTask(Long workerId, Long taskId, String subsiteCaseId, String host) {
         // get all entities
@@ -457,12 +480,12 @@ public class ApiServiceImpl implements ApiService {
         // parse content
         String content = assignedTask.getContent();
         JSONObject assignedContent = new JSONObject();
-        if (content.length() > 0) {
+        if (content.length() > 0){
             assignedContent = new JSONObject(content);
         }
         JSONObject assignedObjs = assignedContent.has("cases") ? assignedContent.getJSONObject("cases") : new JSONObject();
         boolean picked = false;
-        if (assignedObjs.has(String.valueOf(caze.getCaseId()))) {
+        if (assignedObjs.has(String.valueOf(caze.getCaseId()))){
             picked = true;
         }
         JSONObject assignedCase = new JSONObject();
@@ -479,7 +502,7 @@ public class ApiServiceImpl implements ApiService {
         assignedObjs.put(String.valueOf(caze.getCaseId()), assignedCase);
         assignedContent.put("cases", assignedObjs);
         // update assignedTask if not chosen
-        if (!picked) {
+        if (!picked){
             // if not picked before
             assignedTask.setContent(assignedContent.toString());
             assignedTaskDao.save(assignedTask);
@@ -493,44 +516,83 @@ public class ApiServiceImpl implements ApiService {
     }
 
     /**
+     *
      * UTILs methods
+     *
      */
     @Override
-    public String checkCaseAssignment(Long workerId, String subsiteCaseId, Long taskId, String host) {
-        AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
+    public String checkCaseAssignment(Long workerId,
+                                             String subsiteCaseId, Long taskId, String host) {
+        Long[] workerIds = {workerId};
+        String[] results = checkCaseAssignments(workerIds, subsiteCaseId, taskId, host);
+        if (results != null){
+            return results[0];
+        }
+        else{
+            return null;
+        }
+    }
+
+    @Override
+    public String[] checkCaseAssignments(Long[] workerIds, String subsiteCaseId, Long taskId, String host){
+        String[] results = new String[workerIds.length];
         Subsite subsite = subsiteDao.findByBaseUrl(host);
+        if (subsite == null){
+            return null;
+        }
         Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
-        if (assignedTask == null || subsite == null || caze == null) {
+        if (caze == null){
             return null;
         }
 
-        JSONObject contentObj = new JSONObject(assignedTask.getContent());
-        JSONObject casesObj = contentObj.getJSONObject("cases");
-        if (casesObj.has(String.valueOf(caze.getCaseId()))) {
-            return casesObj.get(String.valueOf(caze.getCaseId())).toString();
-        } else {
-            return null;
+        for (int idx = 0 ; idx < workerIds.length; idx ++ ){
+            AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerIds[idx]);
+            if (assignedTask == null){
+                return null;
+            }
+
+            JSONObject contentObj = new JSONObject(assignedTask.getContent());
+            JSONObject casesObj = contentObj.getJSONObject("cases");
+            if (casesObj.has(String.valueOf(caze.getCaseId()))){
+                results[idx] = casesObj.get(String.valueOf(caze.getCaseId())).toString();
+            }
+            else{
+                return null;
+            }
         }
+
+
+        return results;
     }
 
     @Override
-    public String checkCaseExists(Long workerId, String subsiteCaseId, Long taskId, String host) {
-        AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
+    public String checkCaseExists(Long workerId, String subsiteCaseId,
+                                         Long taskId, String host) {
+        Long[] workerIds = {workerId};
+        return checkCaseExists(workerIds, subsiteCaseId, taskId, host);
+    }
+
+    @Override
+    public String checkCaseExists(Long[] workerIds, String subsiteCaseId, Long taskId, String host){
         Subsite subsite = subsiteDao.findByBaseUrl(host);
-        if (subsite == null) {
+        if (subsite == null){
             return "No subsite match from host";
         }
+        String result = "";
+        for (Long workerId : workerIds){
+            AssignedTask assignedTask = assignedTaskDao.findByTaskIdAndWorkerId(taskId, workerId);
+            if (assignedTask == null){
+                result += "AssignedTask not found by task " + taskId + " and worker " + workerId + "; ";
+            }
 
-        Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
+            Case caze = caseDao.findBySubsiteIdAndSubsiteCaseId(subsite.getId(), subsiteCaseId);
+            if (caze == null){
+                result += "Case " + subsiteCaseId + " in subsite " + subsite.getName() + " not found; ";
+            }
 
-        if (assignedTask == null) {
-            return "AssignedTask not found by task and worker";
-        }
-        if (caze == null) {
-            return "Case not found";
         }
 
-        return "";
+        return result;
     }
 
     @Override
@@ -552,64 +614,82 @@ public class ApiServiceImpl implements ApiService {
         return result;
     }
 
-    private boolean groupMemberExceeded(Group group) {
+    @Override
+    public Task getTask(Long taskId) {
+        return taskDao.findOne(taskId);
+    }
+
+    @Override
+    public String getManagerJson(Task task) {
+        JSONObject result = new JSONObject();
+
+        List<Task2AssistantManager> t2as = task2AssistantManagerDao.findByTaskId(task.getId());
+        JSONArray assistantManagers = new JSONArray();
+        for (Task2AssistantManager t2a : t2as){
+            assistantManagers.put(t2a.getManagerId());
+        }
+
+        result.put("owner_id", task.getManagerId());
+        result.put("assistant_ids", assistantManagers);
+
+        return result.toString();
+    }
+
+    private boolean groupMemberExceeded(Group group){
         return (group2WorkerDao.findByGroupId(group.getId()).size() >= managerDao.findOne(group.getManagerId()).getGroupSize());
     }
 
-    private boolean privilegeExpired(Manager manager) {
+    private boolean privilegeExpired(Manager manager){
         Timestamp current = new Timestamp(System.currentTimeMillis());
         if (manager.getExpireTime() == null) {
             return true;
         }
         return manager.getExpireTime().before(current);
     }
-
     public boolean assignTaskForNewMember(String workerEmail, String workerMobile, long groupId) {
-        if (!StringUtils.isEmpty(workerEmail)) {
-            return assignTaskForNewMember(workerDao.findByAccount(workerEmail), groupId);
-        } else {
-            return assignTaskForNewMember(workerDao.findByAccount(workerMobile), groupId);
-        }
+        Worker worker = workerDao.findByAccount(workerEmail, workerMobile);
+        return assignTaskForNewMember(worker, groupId);
     }
 
     public boolean assignTaskForNewMember(long workerId, long groupId) {
         return assignTaskForNewMember(workerDao.findOne(workerId), groupId);
     }
 
-    private boolean assignTaskForNewMember(Worker worker, long groupId) {
-        if (worker == null) {
+    private boolean assignTaskForNewMember(Worker worker, long groupId){
+        if (worker == null){
             return false;
         }
 
         List<Task2Group> taskGroupList = task2GroupDao.findByGroupId(groupId);
-        for (Task2Group task2Group : taskGroupList) {
+        for (Task2Group task2Group : taskGroupList){
             Task task = taskDao.findOne(task2Group.getTaskId());
             // Check if there are already assigned tasks
             AssignedTask existingAssignedTask = assignedTaskDao.findByTaskIdAndWorkerIdIgnoringDeletion(task.getId(), worker.getId());
-            if (existingAssignedTask != null) {
+            if (existingAssignedTask != null){
                 existingAssignedTask.setDeleted(false);
                 assignedTaskDao.save(existingAssignedTask);
                 continue;
-            } else {
+            }
+            else{
                 existingAssignedTask = new AssignedTask();
             }
             List<Task2Case> task2CaseList = task2CaseDao.findByTaskId(task.getId());
             HashMap<Long, List<Long>> caseGroupMap = new HashMap<Long, List<Long>>();
             HashMap<Long, Double> weightGroupMap = new HashMap<Long, Double>();
-            for (Task2Case task2Case : task2CaseList) {
+            for (Task2Case task2Case : task2CaseList){
                 long caseGroupId = task2Case.getCaseIndex();
                 List<Long> caseList = (caseGroupMap.containsKey(caseGroupId)) ? caseGroupMap.get(caseGroupId) : new ArrayList<Long>();
                 caseList.add(task2Case.getCaseId());
                 caseGroupMap.put(caseGroupId, caseList);
 
-                if (!weightGroupMap.containsKey(caseGroupId)) {
+                if (!weightGroupMap.containsKey(caseGroupId)){
                     weightGroupMap.put(caseGroupId, task2Case.getWeight());
                 }
             }
 
             // prepare cases content for AssignedTask
             JSONObject assignedTaskObj = new JSONObject(), assignedCasesObj = new JSONObject();
-            for (Long caseGroupId : caseGroupMap.keySet()) {
+            for (Long caseGroupId : caseGroupMap.keySet()){
                 // Add new AssignedTask
                 List<Long> caseList = caseGroupMap.get(caseGroupId);
                 long chosenCaseId = generateCase(caseList);
@@ -654,11 +734,18 @@ public class ApiServiceImpl implements ApiService {
         return true;
     }
 
+    private static long generateCase(List<Long> caseIdsList) {
+        int serial = new Double(Math.floor(Math.random() * caseIdsList.size()))
+                .intValue();
+        return caseIdsList.get(serial);
+    }
+
+
     @Override
     public String getGroupJSON(Long groupId) {
         JSONObject result = new JSONObject();
         Group group = groupDao.findOne(groupId);
-        if (group == null) {
+        if (group  == null){
             return null;
         }
 
@@ -677,7 +764,7 @@ public class ApiServiceImpl implements ApiService {
 
         List<Group> groups = new ArrayList<Group>();
         List<Group2Worker> group2Workers = group2WorkerDao.findByWorkerId(workerId);
-        for (Group2Worker group2Worker : group2Workers) {
+        for (Group2Worker group2Worker : group2Workers){
             Group group = groupDao.findOne(group2Worker.getGroupId());
 
             Manager groupManager = managerDao.findOne(group.getManagerId());

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/constants/CookieConsts.java

@@ -19,6 +19,10 @@ public class CookieConsts {
     public static final String COOKIE_MANAGER_SESSION = "manager_session";
     public static final String COOKIE_ADMIN_SESSION = "admin_session";
 
+    public static final String COOKIE_WORKER_SUBSITE = "mooc-worker-token";
+    public static final String COOKIE_MANAGER_SUBSITE = "mooc-manager-token";
+    public static final String COOKIE_ADMIN_SUBSITE = "mooc-admin-token";
+
     public static final String COOKIE_CAPTCHA = "captcha";
 
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ApiController.java

@@ -25,6 +25,12 @@ public class ApiController extends BaseController {
     @Autowired
     private ApiLogic apiLogic;
 
+
+    /**
+     *
+     * GET methods
+     *
+     */
     @RequestMapping(value = UrlConstants.API_INTERNAL + "checkIdentity", method = RequestMethod.GET)
     public String checkIdentity(HttpServletRequest request) {
         return apiLogic.checkIdentity(request);
@@ -70,6 +76,16 @@ public class ApiController extends BaseController {
         return apiLogic.getGroups(request);
     }
 
+    @RequestMapping(value = UrlConstants.API_INTERNAL + "getManagers", method = RequestMethod.GET)
+    public String getManagers(HttpServletRequest request) {
+        return apiLogic.getManagers(request);
+    }
+
+    /**
+     *
+     * POST methods
+     *
+     */
     @RequestMapping(value = UrlConstants.API_INTERNAL + "takeTask", method = RequestMethod.POST)
     public String takeTask(HttpServletRequest request, @RequestBody TakeTaskVO body) {
         return apiLogic.takeTask(request, body);
@@ -95,6 +111,11 @@ public class ApiController extends BaseController {
         return apiLogic.recordScore(request, body);
     }
 
+    @RequestMapping(value = UrlConstants.API_INTERNAL + "recordScores", method = RequestMethod.POST)
+    public String recordScores(HttpServletRequest request, @RequestBody RecordScoresVO body) {
+        return apiLogic.recordScores(request, body);
+    }
+
     @RequestMapping(value = UrlConstants.API_INTERNAL + "joinGroup", method = RequestMethod.POST)
     public String joinGroup(HttpServletRequest request, @RequestBody JoinGroupVO body) {
         return apiLogic.joinGroup(request, body);

+ 34 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/internal/CaseResultVO.java

@@ -0,0 +1,34 @@
+package cn.iselab.mooctest.site.web.data.internal;
+
+/**
+ * Created by Liu on 2017/3/26.
+ */
+    public class CaseResultVO{
+        private long workerId;
+        private double score;
+        private String resultUrl;
+
+        public long getWorkerId() {
+            return workerId;
+        }
+
+        public void setWorkerId(long workerId) {
+            this.workerId = workerId;
+        }
+
+        public double getScore() {
+            return score;
+        }
+
+        public void setScore(double score) {
+            this.score = score;
+        }
+
+        public String getResultUrl() {
+            return resultUrl;
+        }
+
+        public void setResultUrl(String resultUrl) {
+            this.resultUrl = resultUrl;
+        }
+    }

+ 37 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/internal/RecordScoresVO.java

@@ -0,0 +1,37 @@
+package cn.iselab.mooctest.site.web.data.internal;
+
+import java.util.List;
+
+/**
+ * Created by Liu on 2017/3/26.
+ */
+public class RecordScoresVO {
+
+    private String caseId;
+    private long taskId;
+    private CaseResultVO[] results;
+
+    public String getCaseId() {
+        return caseId;
+    }
+
+    public void setCaseId(String caseId) {
+        this.caseId = caseId;
+    }
+
+    public long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(long taskId) {
+        this.taskId = taskId;
+    }
+
+    public CaseResultVO[] getResults() {
+        return results;
+    }
+
+    public void setResults(CaseResultVO[] results) {
+        this.results = results;
+    }
+}

+ 16 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/exception/HttpInternalServerError.java

@@ -0,0 +1,16 @@
+package cn.iselab.mooctest.site.web.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * @author guoyc
+ * @date 2017-03-29 9:48 PM.
+ */
+@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
+public class HttpInternalServerError extends RuntimeException{
+
+    public HttpInternalServerError(String message){
+        super(message);
+    }
+}

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ApiLogic.java

@@ -43,4 +43,8 @@ public interface ApiLogic {
     String joinGroup(HttpServletRequest request, JoinGroupVO input);
 
     String verifyApp(HttpServletRequest request, VerifyAppVO input);
+
+    String recordScores(HttpServletRequest request, RecordScoresVO body);
+
+    String getManagers(HttpServletRequest request);
 }

+ 34 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/AccountLogicImpl.java

@@ -19,6 +19,7 @@ import cn.iselab.mooctest.site.web.cookie.persistent.ManagerPersistentCookie;
 import cn.iselab.mooctest.site.web.cookie.persistent.WorkerPersistentCookie;
 import cn.iselab.mooctest.site.web.cookie.session.AdminSessionCookie;
 import cn.iselab.mooctest.site.web.cookie.session.ManagerSessionCookie;
+import cn.iselab.mooctest.site.web.cookie.session.SessionCookie;
 import cn.iselab.mooctest.site.web.cookie.session.WorkerSessionCookie;
 import cn.iselab.mooctest.site.web.data.AccountVO;
 import cn.iselab.mooctest.site.web.data.ManagerVO;
@@ -27,6 +28,7 @@ import cn.iselab.mooctest.site.web.data.wrapper.AdminVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.ManagerVOWrapper;
 import cn.iselab.mooctest.site.web.data.wrapper.WorkerVOWrapper;
 import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
+import cn.iselab.mooctest.site.web.exception.HttpInternalServerError;
 import cn.iselab.mooctest.site.web.exception.HttpUnauthorizedException;
 import cn.iselab.mooctest.site.web.logic.AccountLogic;
 import cn.iselab.mooctest.site.web.util.CaptchaUtils;
@@ -34,8 +36,10 @@ import cn.iselab.mooctest.site.web.util.DataCheckUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.validator.routines.EmailValidator;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.web.ServerProperties;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.sql.Timestamp;
@@ -89,6 +93,27 @@ public class AccountLogicImpl implements AccountLogic {
         return authAdmin(admin, password);
     }
 
+    private void setCookiesforSubsite(UserType userType, String username, HttpServletResponse response) {
+        String cookieName = null;
+        if (userType == UserType.WORKER) {
+            cookieName = CookieConsts.COOKIE_WORKER_SUBSITE;
+        } else if (userType == UserType.MANAGER) {
+            cookieName = CookieConsts.COOKIE_MANAGER_SUBSITE;
+        } else if (userType == UserType.ADMIN) {
+            cookieName = CookieConsts.COOKIE_ADMIN_SUBSITE;
+        }
+
+        try {
+            Cookie cookie = new Cookie(cookieName, EncryptionUtil.encryptDES(username));
+            ResponseUtils.addPersistentCookie(cookie, response);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new HttpInternalServerError("encry error");
+        }
+
+    }
+
+
     @Override
     public AccountVO login(AccountVO accountVO, HttpServletResponse response) {
 
@@ -105,6 +130,8 @@ public class AccountLogicImpl implements AccountLogic {
         if (admin != null) {
             if (admin.getPassword().equals(EncryptionUtil.encryptMD5(password))) {
 
+                String account = (admin.getEmail() == null || admin.getEmail().length() == 0) ? admin.getMobile() : admin.getEmail();
+
                 AdminPersistentCookie persistentCookie = new AdminPersistentCookie();
                 persistentCookie.setId(admin.getId());
                 persistentCookie.setPassword(admin.getPassword());
@@ -119,6 +146,8 @@ public class AccountLogicImpl implements AccountLogic {
                 accountVO.setAdmin(adminVOWrapper.wrap(admin));
                 accountVO.setUserType(UserType.ADMIN.getValue());
 
+                setCookiesforSubsite(UserType.ADMIN, account, response);
+
             } else {
                 throw new HttpUnauthorizedException("Admin username password mismatch");
             }
@@ -144,6 +173,9 @@ public class AccountLogicImpl implements AccountLogic {
                 accountVO.setManager(managerVOWrapper.wrap(manager));
                 accountVO.setUserType(UserType.MANAGER.getValue());
 
+                String account = (manager.getEmail() == null || manager.getEmail().length() == 0) ? manager.getMobile() : manager.getEmail();
+                setCookiesforSubsite(UserType.MANAGER, account, response);
+
             } else {
                 throw new HttpUnauthorizedException("Manager username password mismatch");
             }
@@ -169,6 +201,8 @@ public class AccountLogicImpl implements AccountLogic {
                 accountVO.setWorker(workerVOWrapper.wrap(worker));
                 accountVO.setUserType(UserType.WORKER.getValue());
 
+                String account = (worker.getEmail() == null || worker.getEmail().length() == 0) ? worker.getMobile() : worker.getEmail();
+                setCookiesforSubsite(UserType.WORKER, account, response);
             } else {
                 throw new HttpUnauthorizedException("Worker username password mismatch");
             }

+ 79 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ApiLogicImpl.java

@@ -78,6 +78,9 @@ public class ApiLogicImpl implements ApiLogic {
         return response.toString();
     }
 
+    /**
+     * GET
+     */
     @Override
     public String checkIdentity(HttpServletRequest request) {
         int statusCode = HTTP_OK;
@@ -296,6 +299,35 @@ public class ApiLogicImpl implements ApiLogic {
         return generateResponse(statusCode, "Subsite mismatch", "{}");
     }
 
+
+    @Override
+    public String getManagers(HttpServletRequest request) {
+        int statusCode = HTTP_OK;
+        String host = getSecretHeader(request);
+        if (host != null){
+            String message = "", result = "";
+
+            if (request.getParameter("taskId") == null){
+                return missingParameterResponse;
+            }
+            Long taskId = Long.parseLong(request.getParameter("taskId"));
+            Task task = apiService.getTask(taskId);
+            if (task == null){
+                message = "no such task";
+            }
+            else{
+                result = apiService.getManagerJson(task);
+            }
+
+            return generateResponse(statusCode, message, result);
+        }
+        return generateResponse(statusCode, "Subsite mismatch", "{}");
+    }
+
+    /**
+     * POST
+     */
+
     @Override
     public String takeTask(HttpServletRequest request, TakeTaskVO input) {
         int statusCode = HTTP_OK;
@@ -446,6 +478,52 @@ public class ApiLogicImpl implements ApiLogic {
     }
 
     @Override
+    public String recordScores(HttpServletRequest request, RecordScoresVO input) {
+        int statusCode = HTTP_OK;
+        String host = getSecretHeader(request);
+        if (host != null){
+            if (input == null){
+                return generateResponse(HTTP_INTERNAL_ERROR, "Exception occured" , "{}");
+            }
+            String subsiteCaseId = input.getCaseId();
+            Long taskId = input.getTaskId();
+            CaseResultVO[] caseResults = input.getResults();
+
+            if (caseResults == null || subsiteCaseId == null || taskId == null){
+                return missingParameterResponse;
+            }
+
+            Long[] workerIds = new Long[caseResults.length];
+            String[] resultUrls = new String[caseResults.length];
+            Double[] scores = new Double[caseResults.length];
+            for (int idx = 0 ; idx < caseResults.length ; idx ++ ){
+                CaseResultVO caseResult = caseResults[idx];
+                workerIds[idx] = caseResult.getWorkerId();
+                resultUrls[idx] = caseResult.getResultUrl();
+                scores[idx] = caseResult.getScore();
+            }
+
+            String error = apiService.checkCaseExists(workerIds, subsiteCaseId, taskId, host);
+            if (error != null && error.length() != 0){
+                return generateResponse(statusCode, error, "{}");
+            }
+
+            // Check if the worker has picked the case
+            String[] picked = apiService.checkCaseAssignments(workerIds, subsiteCaseId, taskId, host);
+
+            if (picked == null){
+                return generateResponse(statusCode, "the case has not picked by this worker", "{}");
+            }
+            else{
+                // Add score to result JSON and update total score
+                boolean success = apiService.addScores(host, taskId, workerIds, scores, resultUrls, picked);
+                return generateResponse(statusCode, success ? "" : "less score", apiService.booleanToJSON(success));
+            }
+        }
+        return generateResponse(statusCode, "Subsite mismatch", "{}");
+    }
+
+    @Override
     public String joinGroup(HttpServletRequest request, JoinGroupVO input) {
         int statusCode = HTTP_OK;
         String host = getSecretHeader(request);
@@ -483,5 +561,6 @@ public class ApiLogicImpl implements ApiLogic {
         }
         return generateResponse(statusCode, "Subsite mismatch", "{}");
     }
+
 }