9 Commits

10 changed files with 282 additions and 19 deletions

View File

@@ -0,0 +1,8 @@
package com.example.demo.app.domain.service;
import com.example.demo.app.presentation.form.PasswordResetForm;
public interface PasswordResetService {
boolean resetPassword(Long userId, PasswordResetForm passwordResetForm);
}

View File

@@ -0,0 +1,41 @@
package com.example.demo.app.domain.service.impl;
import org.springframework.stereotype.Service;
import com.example.demo.app.domain.service.PasswordResetService;
import com.example.demo.app.infra.entity.UserEntity;
import com.example.demo.app.infra.repository.UserRepository;
import com.example.demo.app.presentation.form.PasswordResetForm;
import lombok.RequiredArgsConstructor;
@Service
@RequiredArgsConstructor
public class PasswordResetServiceImpl implements PasswordResetService {
private final UserRepository userRepository;
@Override
public boolean resetPassword(
Long userId,
PasswordResetForm passwordResetForm) {
if (!passwordResetForm.getPassword()
.equals(passwordResetForm.getPasswordConfirm())) {
return false;
}
UserEntity userEntity =
userRepository.findById(userId).orElse(null);
if (userEntity == null) {
return false;
}
userEntity.setPassword(passwordResetForm.getPassword());
userRepository.save(userEntity);
return true;
}
}

View File

@@ -1,10 +1,15 @@
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 com.example.demo.app.domain.model.AnalysisModel;
import com.example.demo.app.domain.model.LoginModel;
import com.example.demo.app.domain.service.AnalysisService;
import com.example.demo.app.presentation.form.AnalysisForm;
import lombok.RequiredArgsConstructor;
@@ -16,13 +21,18 @@ public class AnalysisController {
private final AnalysisService analysisService;
@GetMapping("/analysis")
public String showAnalysis(Model model) {
public String showAnalysis(Model model, HttpSession session) {
//ログインユーザーの取得(セッション)
LoginModel loginUser = (LoginModel) session.getAttribute("loginUser");
//分析結果の取得(Service)
AnalysisModel analysisModel = analysisService.getAnalysis(loginUser.getUserId());
AnalysisForm analysisForm = AnalysisForm.convertFrom(analysisModel);
//model格納
model.addAttribute("analysisForm", analysisForm);
return "analysis";
}

View File

@@ -0,0 +1,61 @@
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.PostMapping;
import com.example.demo.app.domain.service.PasswordResetService;
import com.example.demo.app.presentation.form.PasswordResetForm;
import lombok.RequiredArgsConstructor;
@Controller
@RequiredArgsConstructor
public class PasswordResetController {
private final PasswordResetService passwordResetService;
@GetMapping("/password_reset")
public String showPasswordReset(Model model) {
model.addAttribute(
"passwordResetForm",
new PasswordResetForm());
return "password_reset";
}
@PostMapping("/password_reset")
public String resetPassword(
PasswordResetForm passwordResetForm,
Model model,
HttpSession session) {
Long userId =
(Long) session.getAttribute("passwordResetUserId");
if (userId == null) {
return "redirect:/login";
}
boolean isReset =
passwordResetService.resetPassword(
userId,
passwordResetForm);
if (!isReset) {
model.addAttribute(
"errorMessage",
"パスワードが一致していません。");
return "password_reset";
}
session.removeAttribute("passwordResetUserId");
return "redirect:/login";
}
}

View File

@@ -0,0 +1,32 @@
package com.example.demo.app.presentation.form;
import java.util.List;
import com.example.demo.app.domain.model.AnalysisModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AnalysisForm {
private Integer currentMonthTotalAmount;
private Integer previousMonthTotalAmount;
private Integer totalDifferenceAmount;
private List<CategoryAnalysisForm> categoryAnalysisFormList;
public static AnalysisForm convertFrom(
AnalysisModel analysisModel) {
return new AnalysisForm(
analysisModel.getCurrentMonthTotalAmount(),
analysisModel.getPreviousMonthTotalAmount(),
analysisModel.getTotalDifferenceAmount(),
CategoryAnalysisForm.convertFrom(
analysisModel.getCategoryAnalysisModelList()));
}
}

View File

@@ -0,0 +1,48 @@
package com.example.demo.app.presentation.form;
import java.util.List;
import com.example.demo.app.domain.model.CategoryAnalysisModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CategoryAnalysisForm {
private String categoryName;
private Integer currentMonthAmount;
private Integer previousMonthAmount;
private Integer monthDifferenceAmount;
private Integer courseLimitAmount;
private Integer courseDifferenceAmount;
public static CategoryAnalysisForm convertFrom(
CategoryAnalysisModel categoryAnalysisModel) {
return new CategoryAnalysisForm(
categoryAnalysisModel.getCategoryName(),
categoryAnalysisModel.getCurrentMonthAmount(),
categoryAnalysisModel.getPreviousMonthAmount(),
categoryAnalysisModel.getMonthDifferenceAmount(),
categoryAnalysisModel.getCourseLimitAmount(),
categoryAnalysisModel.getCourseDifferenceAmount());
}
public static List<CategoryAnalysisForm> convertFrom(
List<CategoryAnalysisModel> categoryAnalysisModelList) {
return categoryAnalysisModelList.stream()
.map(CategoryAnalysisForm::convertFrom)
.toList();
}
}

View File

@@ -0,0 +1,13 @@
package com.example.demo.app.presentation.form;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PasswordResetForm {
private String password;
private String passwordConfirm;
}

View File

@@ -20,8 +20,8 @@
<tbody>
<tr>
<th scope="row">総支出</th>
<td>¥234,000</td>
<td>+¥38,000</td>
<td th:text="'¥' + ${analysisForm.currentMonthTotalAmount}">0</td>
<td th:text="'¥' + ${analysisForm.totalDifferenceAmount}">0</td>
</tr>
</tbody>
</table>
@@ -33,24 +33,32 @@
<tr>
<th scope="col">カテゴリ別</th>
<th scope="col">支出</th>
<th scope="col">前月比<br>コース比</th>
<th scope="col">
前月比
<br>
コース比
</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">食費</th>
<td>¥34,000</td>
<td>+¥8,000<br>+¥1,100</td>
</tr>
<tr>
<th scope="row">交通費</th>
<td>¥14,000</td>
<td>+¥8,000<br>+¥1,100</td>
</tr>
<tr>
<th scope="row">日用品</th>
<td>¥4,000</td>
<td>+¥8,000<br>+¥1,100</td>
<tr th:each="category : ${analysisForm.categoryAnalysisFormList}">
<th scope="row"
th;text="${category.categoryName}">
食費
</th>
<td th:text="'¥' + ${category.currentMonthAmount}">
0
</td>
<td>
<span th:text="'¥' + ${category.monthDifferenceAmount}">
</span>
<br>
<span th:text="'¥' + ${category.courseDifferenceAmount}">
</span>
</td>
</tr>
</tbody>
</table>

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="ja"xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>パスワード再設定</title>
</head>
<body>
<header></header>
<main>
<h1>パスワード再設定</h1>
<form th:action="@{/password_reset}" th:obiect="${passwordResteForm"} method="post">
<div>
<label for="password">新しいパスワード</label>
<input type="password"
id="password"
th:field="*{password}"
minlength="8"
maxlength="255"
required>
</div>
<div>
<label for="passwordConfirm">パスワード確認</label>
<input type="password"
id="passwordConfirm"
th:field="*{passwordConfirm}"
minlength="8"
maxlength="255"
required>
</div>
<button type="submit">再設定</button>
</form>
<div th:if="${errorMessage}">
<p th:text="${errorMessage}"></p>
</div>
</main>
</body>
</html>

View File

@@ -1,5 +1,5 @@
<!DOCTYPE html>
<html>
<html lang="ja"xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>新規会員登録確認</title>