package org.molgenis.ui.jobs;
import org.molgenis.auth.User;
import org.molgenis.data.DataService;
import org.molgenis.data.Entity;
import org.molgenis.data.Query;
import org.molgenis.data.jobs.model.JobExecutionMetaData;
import org.molgenis.security.user.UserAccountService;
import org.molgenis.ui.MolgenisPluginController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.*;
import static java.util.Objects.requireNonNull;
import static org.molgenis.data.jobs.model.JobExecutionMetaData.SUBMISSION_DATE;
import static org.molgenis.data.jobs.model.JobExecutionMetaData.USER;
import static org.molgenis.ui.jobs.JobsController.URI;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
@Controller
@RequestMapping(URI)
public class JobsController extends MolgenisPluginController
{
public static final String ID = "jobs";
public static final String URI = MolgenisPluginController.PLUGIN_URI_PREFIX + ID;
private static int MAX_JOBS_TO_RETURN = 20;
private UserAccountService userAccountService;
private DataService dataService;
private JobExecutionMetaData jobMetaDataMetaData;
@Autowired
public JobsController(UserAccountService userAccountService, DataService dataService,
JobExecutionMetaData jobMetaDataMetaData)
{
super(URI);
this.userAccountService = requireNonNull(userAccountService);
this.dataService = requireNonNull(dataService);
this.jobMetaDataMetaData = requireNonNull(jobMetaDataMetaData);
}
public JobsController()
{
super(URI);
}
@RequestMapping(method = GET)
public String init(Model model)
{
model.addAttribute("username", userAccountService.getCurrentUser().getUsername());
return "view-jobs";
}
@RequestMapping(method = GET, value = "/latest", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public List<Entity> findLastJobs()
{
final List<Entity> jobs = new ArrayList<>();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -7);
Date weekAgo = cal.getTime();
User currentUser = userAccountService.getCurrentUser();
dataService.getMeta().getEntityTypes()
.filter(e -> e.getExtends() != null && e.getExtends().getName().equals(jobMetaDataMetaData.getName()))
.forEach(e ->
{
Query<Entity> q = dataService.query(e.getName()).ge(JobExecutionMetaData.SUBMISSION_DATE, weekAgo);
if (!currentUser.isSuperuser())
{
q.and().eq(USER, currentUser.getUsername());
}
dataService.findAll(e.getName(), q).forEach(jobs::add);
});
Collections.sort(jobs,
(job1, job2) -> job2.getUtilDate(SUBMISSION_DATE).compareTo(job1.getUtilDate(SUBMISSION_DATE)));
if (jobs.size() > MAX_JOBS_TO_RETURN)
{
return jobs.subList(0, MAX_JOBS_TO_RETURN);
}
return jobs;
}
}