Compare commits
20 Commits
d696d8f376
...
6b4ae5bd96
| Author | SHA1 | Date | |
|---|---|---|---|
| 6b4ae5bd96 | |||
| a2b1922548 | |||
| 1386f4b886 | |||
| 15bf2949bc | |||
| be9abffeaa | |||
| cb7a3f542b | |||
| 702dd24d2e | |||
| d71194659b | |||
| 44ceb0ca07 | |||
| 614533e2b0 | |||
| 2da75305fd | |||
| f55ece4dc7 | |||
| 0a63c81712 | |||
| 571fcc6d90 | |||
| 15185672c4 | |||
| 3833689759 | |||
| 0bec7b3b3b | |||
| 662e3433d2 | |||
| 60d4ebd74f | |||
| 49af15f939 |
@@ -2,6 +2,9 @@ package com.example.demo.app.domain.model;
|
|||||||
|
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
import com.example.demo.app.infra.entity.GoalEntity;
|
||||||
|
import com.example.demo.app.presentation.form.GoalForm;
|
||||||
|
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
@@ -21,4 +24,35 @@ public class GoalModel {
|
|||||||
|
|
||||||
private Integer goalComplete;
|
private Integer goalComplete;
|
||||||
|
|
||||||
|
public static GoalModel convertFrom(GoalEntity goalEntity) {
|
||||||
|
return new GoalModel(
|
||||||
|
goalEntity.getGoalId(),
|
||||||
|
goalEntity.getGoalTitle(),
|
||||||
|
goalEntity.getGoalSubtitle(),
|
||||||
|
goalEntity.getTargetAmount(),
|
||||||
|
goalEntity.getDeadline(),
|
||||||
|
goalEntity.getGoalComplete());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GoalEntity convertTo(GoalModel goalModel) {
|
||||||
|
return new GoalEntity(
|
||||||
|
goalModel.getGoalId(),
|
||||||
|
goalModel.getGoalTitle(),
|
||||||
|
goalModel.getGoalSubtitle(),
|
||||||
|
goalModel.getTargetAmount(),
|
||||||
|
goalModel.getDeadline(),
|
||||||
|
goalModel.getGoalComplete(),
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static GoalModel convertFrom(GoalForm goalForm) {
|
||||||
|
return new GoalModel(
|
||||||
|
goalForm.getGoalId(),
|
||||||
|
goalForm.getGoalTitle(),
|
||||||
|
goalForm.getGoalSubtitle(),
|
||||||
|
goalForm.getTargetAmount(),
|
||||||
|
goalForm.getDeadline(),
|
||||||
|
goalForm.getGoalComplete());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.example.demo.app.domain.service;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.model.GoalModel;
|
||||||
|
|
||||||
|
public interface GoalService {
|
||||||
|
|
||||||
|
GoalModel getGoalById(Long goalId);
|
||||||
|
|
||||||
|
GoalModel getGoalByUserId(Long userId);
|
||||||
|
|
||||||
|
GoalModel createGoal(GoalModel goalModel);
|
||||||
|
|
||||||
|
GoalModel updateGoal(GoalModel goalModel);
|
||||||
|
|
||||||
|
// void deleteGoal(Long goalId);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package com.example.demo.app.domain.service.impl;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.model.GoalModel;
|
||||||
|
import com.example.demo.app.domain.service.GoalService;
|
||||||
|
import com.example.demo.app.infra.entity.GoalEntity;
|
||||||
|
import com.example.demo.app.infra.entity.UserEntity;
|
||||||
|
import com.example.demo.app.infra.repository.GoalRepository;
|
||||||
|
import com.example.demo.app.infra.repository.UserRepository;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class GoalServiceImpl implements GoalService {
|
||||||
|
|
||||||
|
private final GoalRepository goalRepository;
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GoalModel getGoalById(Long goalId) {
|
||||||
|
GoalEntity goalEntity = goalRepository.findById(goalId).orElse(null);
|
||||||
|
return GoalModel.convertFrom(goalEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GoalModel getGoalByUserId(Long userId) {
|
||||||
|
|
||||||
|
UserEntity userEntity = userRepository.findById(userId).orElseThrow();
|
||||||
|
GoalEntity goalEntity = userEntity.getGoalEntity();
|
||||||
|
return GoalModel.convertFrom(goalEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GoalModel createGoal(GoalModel goalModel) {
|
||||||
|
|
||||||
|
GoalEntity goalEntity = GoalModel.convertTo(goalModel);
|
||||||
|
|
||||||
|
GoalEntity savedGoalEntity = goalRepository.save(goalEntity);
|
||||||
|
|
||||||
|
return GoalModel.convertFrom(savedGoalEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GoalModel updateGoal(GoalModel goalModel) {
|
||||||
|
|
||||||
|
GoalEntity goalEntity = GoalModel.convertTo(goalModel);
|
||||||
|
|
||||||
|
GoalEntity updatedGoalEntity = goalRepository.save(goalEntity);
|
||||||
|
|
||||||
|
return GoalModel.convertFrom(updatedGoalEntity);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
package com.example.demo.app.domain.service.impl;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.service.UserService;
|
||||||
|
import com.example.demo.app.infra.entity.CourseEntity;
|
||||||
|
import com.example.demo.app.infra.entity.GoalEntity;
|
||||||
|
import com.example.demo.app.infra.entity.QuestionEntity;
|
||||||
|
import com.example.demo.app.infra.entity.UserEntity;
|
||||||
|
import com.example.demo.app.infra.repository.CourseRepository;
|
||||||
|
import com.example.demo.app.infra.repository.GoalRepository;
|
||||||
|
import com.example.demo.app.infra.repository.QuestionRepository;
|
||||||
|
import com.example.demo.app.infra.repository.UserRepository;
|
||||||
|
import com.example.demo.app.presentation.form.UserForm;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class UserServiceImpl implements UserService {
|
||||||
|
private final UserRepository userRepository;
|
||||||
|
private final QuestionRepository questionRepository;
|
||||||
|
private final GoalRepository goalRepository;
|
||||||
|
private final CourseRepository courseRepository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register(UserForm userForm) {
|
||||||
|
|
||||||
|
UserEntity userEntity = new UserEntity();
|
||||||
|
|
||||||
|
userEntity.setUserName(userForm.getUserName());
|
||||||
|
userEntity.setMailAddress(userForm.getMailAddress());
|
||||||
|
userEntity.setPassword(userForm.getPassword());
|
||||||
|
userEntity.setSecretQuestionAnswer(userForm.getSecretAnswer());
|
||||||
|
userEntity.setBirthDate(userForm.getBirthDate());
|
||||||
|
userEntity.setSaving(userForm.getSaving());
|
||||||
|
userEntity.setBirthDate(userForm. getBirthDate());
|
||||||
|
userEntity.setSaving(userForm.getSaving());
|
||||||
|
userEntity.setAnnualIncome(userForm.getAnnualIncome());
|
||||||
|
userEntity.setMonthlyBudget(userForm.getMonthlyBudget());
|
||||||
|
|
||||||
|
QuestionEntity questionEntity =
|
||||||
|
questionRepository.findById(userForm.getSecretQuestionId()).orElse(null);
|
||||||
|
|
||||||
|
GoalEntity goalEntity =
|
||||||
|
goalRepository.findById(userForm.getGoalId()).orElse(null);
|
||||||
|
|
||||||
|
CourseEntity courseEntity =
|
||||||
|
courseRepository.findById(userForm.getCourseId()).orElse(null);
|
||||||
|
|
||||||
|
userEntity.setQuestionEntity(questionEntity);
|
||||||
|
userEntity.setGoalEntity(goalEntity);
|
||||||
|
userEntity.setCourseEntity(courseEntity);
|
||||||
|
|
||||||
|
userEntity.setDeleteFlag(0);
|
||||||
|
|
||||||
|
userRepository.save(userEntity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ public class GoalEntity {
|
|||||||
@Column(name = "deadline", nullable = false)
|
@Column(name = "deadline", nullable = false)
|
||||||
private LocalDate deadline;
|
private LocalDate deadline;
|
||||||
|
|
||||||
@Column(name = "goal_complete", nullable = false)
|
@Column(name = "goal_complete", nullable = true)
|
||||||
private Integer goalComplete;
|
private Integer goalComplete;
|
||||||
|
|
||||||
@OneToOne(mappedBy = "goalEntity")
|
@OneToOne(mappedBy = "goalEntity")
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package com.example.demo.app.presentation.controller;
|
||||||
|
|
||||||
|
import jakarta.servlet.http.HttpSession;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
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.RequestMapping;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.model.GoalModel;
|
||||||
|
import com.example.demo.app.domain.model.LoginModel;
|
||||||
|
import com.example.demo.app.domain.service.GoalService;
|
||||||
|
import com.example.demo.app.presentation.form.GoalForm;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
@RequestMapping("/goal")
|
||||||
|
public class GoalController {
|
||||||
|
|
||||||
|
private final GoalService goalService;
|
||||||
|
|
||||||
|
@GetMapping("")
|
||||||
|
public String getGoal(Model model, HttpSession session) {
|
||||||
|
|
||||||
|
LoginModel loginUser = (LoginModel) session.getAttribute("loginUser");
|
||||||
|
|
||||||
|
Long userId = loginUser.getUserId();
|
||||||
|
//テスト用
|
||||||
|
// Long userId = 1L;
|
||||||
|
|
||||||
|
GoalModel goalModel = goalService.getGoalByUserId(userId);
|
||||||
|
GoalForm goalForm = GoalForm.convertFrom(goalModel);
|
||||||
|
|
||||||
|
model.addAttribute("goalForm", goalForm);
|
||||||
|
return "goal_view";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/edit")
|
||||||
|
public String editGoal(Model model, HttpSession session) {
|
||||||
|
|
||||||
|
LoginModel loginUser = (LoginModel) session.getAttribute("loginUser");
|
||||||
|
Long userId = loginUser.getUserId();
|
||||||
|
|
||||||
|
//テスト用
|
||||||
|
// Long userId = 1L;
|
||||||
|
|
||||||
|
GoalModel goalModel = goalService.getGoalByUserId(userId);
|
||||||
|
GoalForm goalForm = GoalForm.convertFrom(goalModel);
|
||||||
|
|
||||||
|
model.addAttribute("goalForm", goalForm);
|
||||||
|
return "goal_edit";
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/update")
|
||||||
|
public String updateGoal(@ModelAttribute GoalForm goalForm, HttpSession session) {
|
||||||
|
|
||||||
|
LoginModel loginUser = (LoginModel) session.getAttribute("loginUser");
|
||||||
|
|
||||||
|
Long userId = loginUser.getUserId();
|
||||||
|
//テスト用
|
||||||
|
// Long userId = 1L;
|
||||||
|
|
||||||
|
|
||||||
|
// 本人の目標かどうかを確認してから更新する
|
||||||
|
GoalModel currentGoal = goalService.getGoalByUserId(userId);
|
||||||
|
|
||||||
|
if (!currentGoal.getGoalId().equals(goalForm.getGoalId())) {
|
||||||
|
return "redirect:/goal"; // 他人のデータを更新しようとしたら弾く
|
||||||
|
}
|
||||||
|
|
||||||
|
GoalModel goalModel = GoalModel.convertFrom(goalForm);
|
||||||
|
goalService.updateGoal(goalModel);
|
||||||
|
|
||||||
|
return "redirect:/goal";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package com.example.demo.app.presentation.form;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
import com.example.demo.app.domain.model.GoalModel;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class GoalForm {
|
||||||
|
|
||||||
|
private Long goalId;
|
||||||
|
|
||||||
|
private String goalTitle;
|
||||||
|
|
||||||
|
private String goalSubtitle;
|
||||||
|
|
||||||
|
private Integer targetAmount;
|
||||||
|
|
||||||
|
private LocalDate deadline;
|
||||||
|
|
||||||
|
private Integer goalComplete;
|
||||||
|
|
||||||
|
public static GoalForm convertFrom(GoalModel goalModel) {
|
||||||
|
return new GoalForm(
|
||||||
|
goalModel.getGoalId(),
|
||||||
|
goalModel.getGoalTitle(),
|
||||||
|
goalModel.getGoalSubtitle(),
|
||||||
|
goalModel.getTargetAmount(),
|
||||||
|
goalModel.getDeadline(),
|
||||||
|
goalModel.getGoalComplete());
|
||||||
|
}
|
||||||
|
|
||||||
|
// public static List<GoalForm> convertFrom(List<GoalModel> goalModelList) {
|
||||||
|
// return goalModelList.stream().map(GoalForm::convertFrom).toList();
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
38
src/main/resources/templates/goal_edit.html
Normal file
38
src/main/resources/templates/goal_edit.html
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>目標編集</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>目標編集</h1>
|
||||||
|
|
||||||
|
<form th:action="@{/goal/update}" th:object="${goalForm}" method="post">
|
||||||
|
<input type="hidden" th:field="*{goalId}">
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>目標名</label>
|
||||||
|
<input type="text" th:field="*{goalTitle}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>目標説明</label>
|
||||||
|
<textarea th:field="*{goalSubtitle}"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>目標金額</label>
|
||||||
|
<input type="number" th:field="*{targetAmount}">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<label>目標達成期限</label>
|
||||||
|
<input type="date" th:field="*{deadline}">
|
||||||
|
</div>
|
||||||
|
<button type="submit">更新する</button>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
src/main/resources/templates/goal_view.html
Normal file
35
src/main/resources/templates/goal_view.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>目標詳細</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<h1>目標詳細</h1>
|
||||||
|
|
||||||
|
<table>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>目標名</th>
|
||||||
|
<td th:text="${goalForm.goalTitle}"></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<th>目標説明</th>
|
||||||
|
<td th:text="${goalForm.goalSubtitle}"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>目標金額</th>
|
||||||
|
<td th:text="${goalForm.targetAmount}"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>目標達成期限</th>
|
||||||
|
<td th:text="${goalForm.deadline}"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<a th:href="@{/goal/edit}">編集する</a>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user