Newer
Older
task-bldg / src / main / java / osm / surveyor / task / city / TaskController.java
@haya4 haya4 on 1 Aug 2022 4 KB OK: TASK画面
package osm.surveyor.task.city;

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

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import lombok.RequiredArgsConstructor;
import osm.surveyor.task.city.model.City;
import osm.surveyor.task.city.model.Citymesh;
import osm.surveyor.task.city.model.CitymeshPK;
import osm.surveyor.task.city.model.Operation;
import osm.surveyor.task.city.model.Status;
import osm.surveyor.task.city.model.Task;

@RequiredArgsConstructor
@Controller
public class TaskController {
	private final CityRepository cityRepository;
	private final CitymeshRepository meshRepository;
	private final TaskRepository taskRepository;
	
	/**
	 * ログインユーザーが関係しているTASKリスト
	 * @param model
	 * @return
	 */
	@GetMapping("/tasks")
	public String showList(@AuthenticationPrincipal UserDetails user, Model model,
			@RequestParam(name="citycode") String citycode,
			@RequestParam(name="meshcode") String meshcode)
	{
		// ログイン名を取得
		String loginName = "";
    	if (user != null) {
    		loginName = user.getUsername();
    	}
        model.addAttribute("username", loginName);

        City city = cityRepository.getById(citycode);
		model.addAttribute("citycode", citycode);
		model.addAttribute("cityname", city.getCityname());
		model.addAttribute("meshcode", meshcode);
		
		CitymeshPK pk = new CitymeshPK();
		pk.setCitycode(citycode);
		pk.setMeshcode(meshcode);
		Citymesh mesh = meshRepository.getById(pk);
        model.addAttribute("mesh", mesh);
        
		List<Task> tasks = taskRepository.serchByMesh(citycode, meshcode);
		model.addAttribute("tasks", tasks);
		return "tasks";
	}
	
	/**
	 * 「予約登録」
	 * @param user
	 * @param model
	 * @param citycode
	 * @param meshcode
	 * @return
	 */
	@GetMapping("/task/reserve")
	public String showTask(@AuthenticationPrincipal UserDetails user, Model model,
			@RequestParam(name="citycode") String citycode,
			@RequestParam(name="meshcode") String meshcode) 
	{
		// ログイン名を取得
		String loginName = "";
    	if (user != null) {
    		loginName = user.getUsername();
    	}
        model.addAttribute("username", loginName);
        
        City city = cityRepository.getById(citycode);
		model.addAttribute("citycode", citycode);
		model.addAttribute("cityname", city.getCityname());
		model.addAttribute("meshcode", meshcode);
		
		CitymeshPK pk = new CitymeshPK();
		pk.setCitycode(citycode);
		pk.setMeshcode(meshcode);
		Citymesh mesh = meshRepository.getById(pk);
		
		List<Task> tasks = taskRepository.serchByMesh(citycode, meshcode);
		for (Task t : tasks) {
			model.addAttribute("task", t);
			return "task";
		}
		
		// Taskが無い場合は生成する
		String uuid = UUID.randomUUID().toString();
		Task task = new Task();
		task.setCurrentId(uuid);
		task.setPreId(uuid);
		task.setCitycode(citycode);
		task.setMeshcode(meshcode);
		task.setMesh(mesh);
		task.setStatus(Status.PREPARATION);
		task.setUsername(loginName);
		task.setOperation(Operation.RESERVE);
		model.addAttribute("task", task);
		return "task";
	}
	
	@GetMapping("/task/add")
	public String addTask(
			@RequestParam(name="citycode") String citycode,
			@RequestParam(name="meshcode") String meshcode,
			@ModelAttribute Task task)
	{
		return "task";
	}
	
	@PostMapping("/task/process")
	public String process(@AuthenticationPrincipal UserDetails user, 
			@Validated @ModelAttribute Task task,
			BindingResult result)
	{
		if (result.hasErrors()) {
			return "task";
		}
		task.setUpdateTime(new Date());
		taskRepository.save(task);
		
		return "redirect:/tasks?citycode="+ task.getCitycode() +"&meshcode="+ task.getMeshcode();
	}
}