diff --git a/.gitignore b/.gitignore index a2afc5d..abe0824 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ target/ ### IntelliJ IDEA ### .idea +*.iml ### Eclipse ### diff --git a/README.MD b/README.MD new file mode 100644 index 0000000..bfc2efb --- /dev/null +++ b/README.MD @@ -0,0 +1,28 @@ +# Quest LedZeppelin + +### Ребята и девчата, всем привет! + +На этот раз у нас более сложный проект, который будет трудно объединить в один общий проект со всем зависимостями. +Поэтому поступим просто. Тут первоначально лежит наш учебный проект. +Заготовка, такая же как может быть сгенерирована в IDEA. +Договоримся, что Java у нас будет 21-я. У всех. Привыкайте использовать только LTS. +Из зависимостей есть jakarta.servlet-api + jstl, JUnit5 и Lombok, +так что POM.xml возможно надо будет заменить на свой. + +### Что нужно сделать. + +1. Сделайте форк и затем клон этого репозитория. +2. **СРАЗУ** создайте в нем ветку со своей фамилией, например, ivanov. +3. Размещайте в своей ветке свое решение (если мои примеры мешают их можно просто удалить - ветвление же). +4. В конце вам нужно будет сделать **Pull Request** из своей ветки (в своем форке) в такую же точно ветку (в этом удаленном + репозитории), если вы не найдете - тогда в **main** ну и затем ОБЯЗАТЕЛЬНО заполнить форму проектов. +5. Я положу в ветку **khmelov** тот пример, который буду параллельно с вами разрабатывать на факультативах. Полезнее будет + не копипастить, смотрите видео, разбирайтесь, что, почему, где и как сделано. Не копируйте, нужно ВАШЕ решение. Но мы уже и + не совсем зеленые, правда ведь ;). +6. Проверять проекты по итогам третьего модуля я буду с **code review**, и скорее всего быстро не получится, так что за + сроки сдачи можно не волноваться. +7. Планируйте время так, первые три консультации - основной функционал. Последняя консультация - плюшки, рефакторинг, + тесты, красоты. +8. Если будут какие-то моменты - я обновлю это README. Поглядывайте периодически. + +#### _2024 JRU LedZeppelin, Александр Хмелев._ diff --git a/src/main/java/com/javarush/GameRecord.java b/src/main/java/com/javarush/GameRecord.java new file mode 100644 index 0000000..32a1a06 --- /dev/null +++ b/src/main/java/com/javarush/GameRecord.java @@ -0,0 +1,33 @@ +package com.javarush; + +import java.time.LocalDateTime; + +public class GameRecord { + private LocalDateTime timestamp; + private int score; + private boolean isWin; + + public void setTimestamp(LocalDateTime timestamp) { + this.timestamp = timestamp; + } + + public void setScore(int score) { + this.score = score; + } + + public void setWin(boolean win) { + isWin = win; + } + + public LocalDateTime getTimestamp() { + return timestamp; + } + + public int getScore() { + return score; + } + + public boolean isWin() { + return isWin; + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/lesson14/controller/EditUserServlet.java b/src/main/java/com/javarush/babkin/EditUserServlet.java similarity index 57% rename from src/main/java/com/javarush/khmelov/lesson14/controller/EditUserServlet.java rename to src/main/java/com/javarush/babkin/EditUserServlet.java index abb624f..0c45ab0 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/controller/EditUserServlet.java +++ b/src/main/java/com/javarush/babkin/EditUserServlet.java @@ -1,9 +1,8 @@ -package com.javarush.khmelov.lesson14.controller; +package com.javarush.babkin; -import com.javarush.khmelov.lesson14.config.Winter; -import com.javarush.khmelov.lesson14.entity.Role; -import com.javarush.khmelov.lesson14.entity.User; -import com.javarush.khmelov.lesson14.service.UserService; +import com.javarush.babkin.entity.Role; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; import jakarta.servlet.ServletConfig; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -11,13 +10,14 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.Optional; @WebServlet(value = "/edit-user", loadOnStartup = 1) public class EditUserServlet extends HttpServlet { - private final UserService userService = Winter.find(UserService.class); + private final UserService userService = UserService.USER_SERVICE; @Override public void init(ServletConfig config) throws ServletException { @@ -26,30 +26,42 @@ public void init(ServletConfig config) throws ServletException { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - String stringId = req.getParameter("id"); - if (stringId != null) { - long id = Long.parseLong(stringId); - Optional user = userService.get(id); + String id = req.getParameter("id"); + if (id != null) { + long userId = Long.parseLong(id); + Optional user = userService.getById(userId); user.ifPresent(value -> req.setAttribute("user", value)); +// if (user.isPresent()) { +// req.setAttribute("user", user); +// } } req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String parameter = req.getParameter("id"); User user = User.builder() - .id(parameter!=null?Long.parseLong(parameter):null) + .id(parameter != null ? Long.parseLong(parameter) : null) .login(req.getParameter("login")) .password(req.getParameter("password")) .role(Role.valueOf(req.getParameter("role"))) .build(); - if (req.getParameter("create") != null) { - userService.create(user); - } else if (req.getParameter("update") != null) { - user.setId(Long.parseLong(req.getParameter("id"))); + + +// if (req.getParameter("create")!= null) { +// userService.create(user); +// } else + if (req.getParameter("update") != null) { + user.setId(Long.valueOf(req.getParameter("id"))); userService.update(user); + } else if (req.getParameter("delete") != null) { + user.setId(Long.valueOf(req.getParameter("id"))); + userService.delete(user); } + +// resp.sendRedirect(req.getContextPath() + "/edit-user?id=" + req.getParameter("id")); resp.sendRedirect(req.getContextPath() + "/edit-user?id=" + user.getId()); } } diff --git a/src/main/java/com/javarush/babkin/PlayerStats.java b/src/main/java/com/javarush/babkin/PlayerStats.java new file mode 100644 index 0000000..74b8e6d --- /dev/null +++ b/src/main/java/com/javarush/babkin/PlayerStats.java @@ -0,0 +1,42 @@ +package com.javarush.babkin; + +public class PlayerStats { + + private long playerId; + private int totalGames; + private int wins; + private int losses; + + public PlayerStats(long playerId) { + this.playerId = playerId; + this.totalGames = 0; + this.wins = 0; + this.losses = 0; + } + + + public long getPlayerId() { return playerId; } + public int getTotalGames() { return totalGames; } + public int getWins() { return wins; } + public int getLosses() { return losses; } + + + public void setTotalGames(int totalGames) { this.totalGames = totalGames; } + public void setWins(int wins) { this.wins = wins; } + public void setLosses(int losses) { this.losses = losses; } + + public double getWinRate() { + if (totalGames == 0) return 0.0; + return (double) wins / totalGames * 100; + } + + public void incrementWin() { + totalGames++; + wins++; + } + + public void incrementLoss() { + totalGames++; + losses++; + } +} diff --git a/src/main/java/com/javarush/babkin/QuestProgress.java b/src/main/java/com/javarush/babkin/QuestProgress.java new file mode 100644 index 0000000..62876a8 --- /dev/null +++ b/src/main/java/com/javarush/babkin/QuestProgress.java @@ -0,0 +1,16 @@ +package com.javarush.babkin; + +public class QuestProgress { + private String step = "start"; + private boolean finished = false; + + public QuestProgress() { + this.step = "start"; + this.finished = false; + } + + public String getStep() { return step; } + public void setStep(String step) { this.step = step; } + public boolean isFinished() { return finished; } + public void setFinished(boolean finished) { this.finished = finished; } +} diff --git a/src/main/java/com/javarush/babkin/UserDto.java b/src/main/java/com/javarush/babkin/UserDto.java new file mode 100644 index 0000000..3a61ba8 --- /dev/null +++ b/src/main/java/com/javarush/babkin/UserDto.java @@ -0,0 +1,43 @@ +package com.javarush.babkin; + +public class UserDto { + private long id; + private String login; + private int totalGames; + private int wins; + private int losses; + private double winRate; + + public UserDto(long id, String login, int totalGames, int wins, int losses, double winRate) { + this.id = id; + this.login = login; + this.totalGames = totalGames; + this.wins = wins; + this.losses = losses; + this.winRate = winRate; + } + + public long getId() { + return id; + } + + public String getLogin() { + return login; + } + + public int getTotalGames() { + return totalGames; + } + + public int getWins() { + return wins; + } + + public int getLosses() { + return losses; + } + + public double getWinRate() { + return winRate; + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/lesson14/controller/ListUserServlet.java b/src/main/java/com/javarush/babkin/UserListServlet.java similarity index 53% rename from src/main/java/com/javarush/khmelov/lesson14/controller/ListUserServlet.java rename to src/main/java/com/javarush/babkin/UserListServlet.java index 9fc818f..0f17c01 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/controller/ListUserServlet.java +++ b/src/main/java/com/javarush/babkin/UserListServlet.java @@ -1,27 +1,28 @@ -package com.javarush.khmelov.lesson14.controller; +package com.javarush.babkin; -import com.javarush.khmelov.lesson14.config.Winter; -import com.javarush.khmelov.lesson14.entity.User; -import com.javarush.khmelov.lesson14.service.UserService; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; import java.util.Collection; -@WebServlet("/list-user") -public class ListUserServlet extends HttpServlet { +@WebServlet(value = {"","/user-list"}) +public class UserListServlet extends HttpServlet { - private final UserService userService= Winter.find(UserService.class); + private final UserService userService = UserService.USER_SERVICE; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Collection users = userService.getAll(); + req.setAttribute("users", users); - req.getRequestDispatcher("/WEB-INF/list-user.jsp") - .forward(req, resp); + req.getRequestDispatcher("/WEB-INF/user-list.jsp").forward(req, resp); + } } diff --git a/src/main/java/com/javarush/babkin/UserStatsAdapter.java b/src/main/java/com/javarush/babkin/UserStatsAdapter.java new file mode 100644 index 0000000..60051a0 --- /dev/null +++ b/src/main/java/com/javarush/babkin/UserStatsAdapter.java @@ -0,0 +1,34 @@ +package com.javarush.babkin; + +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.StatsService; +import com.javarush.babkin.service.UserService; + +public class UserStatsAdapter { + + private final UserService userService; + private final StatsService statsService; + + public UserStatsAdapter(UserService userService, StatsService statsService) { + this.userService = userService; + this.statsService = statsService; + } + + public UserDto getUserWithStats(long userId) { + User user = userService.getUserById(userId); + if (user == null) { + return null; + } + + PlayerStats stats = statsService.getStatsForUser(user); + + return new UserDto( + user.getId(), + user.getLogin(), + stats.getTotalGames(), + stats.getWins(), + stats.getLosses(), + stats.getWinRate() + ); + } +} diff --git a/src/main/java/com/javarush/babkin/entity/Quest.java b/src/main/java/com/javarush/babkin/entity/Quest.java new file mode 100644 index 0000000..83dcbd3 --- /dev/null +++ b/src/main/java/com/javarush/babkin/entity/Quest.java @@ -0,0 +1,19 @@ +package com.javarush.babkin.entity; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class Quest { + private Long id; + private String title; + private String description; + + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/babkin/entity/Role.java b/src/main/java/com/javarush/babkin/entity/Role.java new file mode 100644 index 0000000..ae0aa0a --- /dev/null +++ b/src/main/java/com/javarush/babkin/entity/Role.java @@ -0,0 +1,5 @@ +package com.javarush.babkin.entity; + +public enum Role { + ADMIN, USER, GUEST +} diff --git a/src/main/java/com/javarush/babkin/entity/User.java b/src/main/java/com/javarush/babkin/entity/User.java new file mode 100644 index 0000000..0304c42 --- /dev/null +++ b/src/main/java/com/javarush/babkin/entity/User.java @@ -0,0 +1,47 @@ +package com.javarush.babkin.entity; + +import com.javarush.GameRecord; +import com.javarush.babkin.PlayerStats; +import com.javarush.babkin.QuestProgress; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class User { + + private Long id; + private String login; + private String password; + private Role role; + private QuestProgress questProgress; + + private int wins; + private int losses; + + private PlayerStats stats; + private Integer totalGames; + private List gameHistory; + + public int getWins() { + return (int) gameHistory.stream() + .filter(GameRecord::isWin) // предполагаем поле isWin в GameRecord + .count(); + } + + public int getLosses() { + return (int) gameHistory.stream() + .filter(game -> !game.isWin()) // не победа = поражение + .count(); + } + + public String getImage() {return "image-" + id; } + + +} diff --git a/src/main/java/com/javarush/khmelov/lesson14/repository/Repository.java b/src/main/java/com/javarush/babkin/repository/Repository.java similarity index 70% rename from src/main/java/com/javarush/khmelov/lesson14/repository/Repository.java rename to src/main/java/com/javarush/babkin/repository/Repository.java index 26f6fad..fb0633c 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/repository/Repository.java +++ b/src/main/java/com/javarush/babkin/repository/Repository.java @@ -1,6 +1,6 @@ -package com.javarush.khmelov.lesson14.repository; +package com.javarush.babkin.repository; -import com.javarush.khmelov.lesson14.entity.User; +import com.javarush.babkin.entity.User; import java.util.Collection; import java.util.Optional; diff --git a/src/main/java/com/javarush/babkin/repository/UserRepository.java b/src/main/java/com/javarush/babkin/repository/UserRepository.java new file mode 100644 index 0000000..4279914 --- /dev/null +++ b/src/main/java/com/javarush/babkin/repository/UserRepository.java @@ -0,0 +1,71 @@ +package com.javarush.babkin.repository; + + +import com.javarush.babkin.QuestProgress; +import com.javarush.babkin.entity.Role; +import com.javarush.babkin.entity.User; + +import java.util.*; +import java.util.concurrent.atomic.AtomicLong; + +public class UserRepository implements Repository { + + private final Map map = new HashMap<>(); + + public static final AtomicLong id = new AtomicLong(System.currentTimeMillis()); + + + public UserRepository() { + map.put(1L, User.builder() + .id(1L) + .login("ZZTop") + .password("12345") + .role(Role.ADMIN) + .questProgress(new QuestProgress()) + .build()); + + map.put(2L, User.builder() + .id(2L) + .login("Aerosmith") + .password("qwert") + .role(Role.USER) + .questProgress(new QuestProgress()) + .build()); + + map.put(3L, User.builder() + .id(3L) + .login("Ramones") + .password("asdf") + .role(Role.GUEST) + .questProgress(new QuestProgress()) + .build()); + } + + + + @Override + public Collection getAll() { + return map.values(); + } + + @Override + public Optional get(long id) { + return Optional.ofNullable(map.get(id)); + } + + @Override + public void create(User entity) { + entity.setId(id.incrementAndGet()); + update(entity); + } + + @Override + public void update(User entity) { + map.put(entity.getId(), entity); + } + + @Override + public void delete(User entity) { + map.remove(entity.getId()); + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/babkin/service/StatsService.java b/src/main/java/com/javarush/babkin/service/StatsService.java new file mode 100644 index 0000000..8b8f3e7 --- /dev/null +++ b/src/main/java/com/javarush/babkin/service/StatsService.java @@ -0,0 +1,73 @@ +package com.javarush.babkin.service; + +import com.javarush.babkin.PlayerStats; +import com.javarush.babkin.entity.User; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class StatsService { + private final Map statsMap = new ConcurrentHashMap<>(); + + private static final StatsService INSTANCE = new StatsService(); + + public PlayerStats getStatsForUser(User user) { + return statsMap.computeIfAbsent(user.getId(), id -> new PlayerStats(id)); + } + + public void updateUserStats(User user, boolean isWin) { + PlayerStats stats = getStatsForUser(user); + if (isWin) { + stats.incrementWin(); + } else { + stats.incrementLoss(); + } + user.setStats(stats); + } + + + public void populateStatsForUsers(List users) { + for (User user : users) { + user.setStats(getStatsForUser(user)); + } + } + + public static StatsService getInstance() { + return INSTANCE; + } + + public PlayerStats getStats(long playerId) { + return statsMap.computeIfAbsent(playerId, id -> new PlayerStats(id)); + } + + + public void recordWin(long playerId) { + PlayerStats stats = getStats(playerId); + stats.incrementWin(); + } + + + public void recordLoss(long playerId) { + PlayerStats stats = getStats(playerId); + stats.incrementLoss(); + } + + + public void updateStats(long playerId, int totalGames, int wins, int losses) { + PlayerStats stats = getStats(playerId); + stats.setTotalGames(totalGames); + stats.setWins(wins); + stats.setLosses(losses); + } + + + public void resetStats(long playerId) { + statsMap.remove(playerId); + } + + + public Map getAllStats() { + return new ConcurrentHashMap<>(statsMap); + } +} diff --git a/src/main/java/com/javarush/babkin/service/UserService.java b/src/main/java/com/javarush/babkin/service/UserService.java new file mode 100644 index 0000000..a9aa342 --- /dev/null +++ b/src/main/java/com/javarush/babkin/service/UserService.java @@ -0,0 +1,53 @@ +package com.javarush.babkin.service; + + +import com.javarush.babkin.QuestProgress; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.repository.Repository; +import com.javarush.babkin.repository.UserRepository; + +import java.util.Collection; +import java.util.Optional; + +public enum UserService { + USER_SERVICE; + + public final Repository userRepository = new UserRepository(); + + public void create(User user) { + userRepository.create(user); + } + + public void update(User user) { + userRepository.update(user); + } + + public void delete(User user) { + userRepository.delete(user); + } + + public Collection getAll() { + return userRepository.getAll(); + } + + public Optional getById(long id) { + return userRepository.get(id); + } + + public User getUserById(long userId) { + return userRepository.get(userId).orElse(null); + } + + public void updateQuestProgress(Long userId, QuestProgress progress) { + userRepository.get(userId).ifPresent(user -> { + user.setQuestProgress(progress); + userRepository.update(user); + }); + } + + public QuestProgress getQuestProgress(Long userId) { + return userRepository.get(userId) + .map(User::getQuestProgress) + .orElse(new QuestProgress()); + } +} diff --git a/src/main/java/com/javarush/babkin/servlets/CreateUserServlet.java b/src/main/java/com/javarush/babkin/servlets/CreateUserServlet.java new file mode 100644 index 0000000..2f4cbd8 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/CreateUserServlet.java @@ -0,0 +1,53 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.entity.Role; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +import java.io.IOException; + + +@WebServlet("/create-user") +public class CreateUserServlet extends HttpServlet { + + private final UserService userService = UserService.USER_SERVICE; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.getRequestDispatcher("/WEB-INF/create-user.jsp").forward(req, resp); + } + + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String parameter = req.getParameter("id"); + + + boolean isRegistration = (parameter == null || parameter.trim().isEmpty()); + + + User user = new User(); + user.setId(isRegistration ? null : Long.valueOf(parameter)); + user.setLogin(req.getParameter("login")); + user.setPassword(req.getParameter("password")); + user.setRole(Role.valueOf(req.getParameter("role"))); + + if (req.getParameter("create") != null) { + userService.create(user); + } + + if (isRegistration) { + resp.sendRedirect(req.getContextPath() + "/user-list?userId=" + user.getId()); + } else { + resp.sendRedirect(req.getContextPath() + "/edit-user?id=" + user.getId()); + } + } + +} + diff --git a/src/main/java/com/javarush/babkin/servlets/DeleteUserServlet.java b/src/main/java/com/javarush/babkin/servlets/DeleteUserServlet.java new file mode 100644 index 0000000..204ce29 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/DeleteUserServlet.java @@ -0,0 +1,42 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.Optional; + +@WebServlet("/delete-user") +public class DeleteUserServlet extends HttpServlet { + + private final UserService userService = UserService.USER_SERVICE; // Ваш экземпляр сервиса + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + String userIdParam = request.getParameter("userId"); + if (userIdParam == null || userIdParam.trim().isEmpty()) { + response.sendError(HttpServletResponse.SC_BAD_REQUEST, "ID пользователя не указан"); + return; + } + + long userId = Long.parseLong(request.getParameter("userId")); + + Optional optionalUser = userService.getById(userId); + if (optionalUser.isPresent()) { + User user = optionalUser.get(); + userService.delete(user); + response.sendRedirect(request.getContextPath() + "/user-list"); + } else { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Пользователь не найден"); + } + + } +} + diff --git a/src/main/java/com/javarush/babkin/servlets/EditUserServlet.java b/src/main/java/com/javarush/babkin/servlets/EditUserServlet.java new file mode 100644 index 0000000..d7759b6 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/EditUserServlet.java @@ -0,0 +1,111 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.entity.Role; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +import java.io.IOException; +import java.util.Optional; + +@WebServlet(value = "/edit-user", loadOnStartup = 1) +public class EditUserServlet extends HttpServlet { + + private final UserService userService = UserService.USER_SERVICE; + + @Override + public void init(ServletConfig config) throws ServletException { + config.getServletContext().setAttribute("roles", Role.values()); + } + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + String idParam = req.getParameter("id"); + + if (idParam == null || idParam.trim().isEmpty()) { + req.setAttribute("error", "ID пользователя не указан."); + req.getRequestDispatcher("/WEB-INF/error.jsp").forward(req, resp); + return; + } + + try { + long userId = Long.parseLong(idParam); + Optional user = userService.getById(userId); + + if (user.isPresent()) { + req.setAttribute("user", user.get()); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + } else { + req.setAttribute("error", "Пользователь не найден."); + req.getRequestDispatcher("/WEB-INF/error.jsp").forward(req, resp); + } + } catch (NumberFormatException e) { + req.setAttribute("error", "Некорректный ID: " + idParam); + req.getRequestDispatcher("/WEB-INF/error.jsp").forward(req, resp); + } + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + String idParam = req.getParameter("id"); + String login = req.getParameter("login"); + String password = req.getParameter("password"); + String roleParam = req.getParameter("role"); + + if (idParam == null || idParam.trim().isEmpty() || + login == null || login.trim().isEmpty() || + password == null || password.trim().isEmpty() || + roleParam == null || roleParam.trim().isEmpty()) { + + req.setAttribute("error", "Все поля обязательны для заполнения."); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + return; + } + + try { + long userId = Long.parseLong(idParam); + + Role role; + try { + role = Role.valueOf(roleParam.toUpperCase()); + } catch (IllegalArgumentException e) { + req.setAttribute("error", "Недопустимая роль: " + roleParam); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + return; + } + + User user = User.builder() + .id(userId) + .login(login) + .password(password) + .role(role) + .build(); + + if ("true".equals(req.getParameter("update"))) { + userService.update(user); + resp.sendRedirect(req.getContextPath() + "/user-list"); + } else if ("true".equals(req.getParameter("delete"))) { + userService.delete(user); + resp.sendRedirect(req.getContextPath() + "/user-list"); + } else { + req.setAttribute("error", "Неизвестное действие."); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + } + + } catch (NumberFormatException e) { + req.setAttribute("error", "Некорректный ID: " + idParam); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + } catch (Exception e) { + req.setAttribute("error", "Ошибка при обработке запроса: " + e.getMessage()); + req.getRequestDispatcher("/WEB-INF/edit-user.jsp").forward(req, resp); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/babkin/servlets/HelloServlet.java b/src/main/java/com/javarush/babkin/servlets/HelloServlet.java new file mode 100644 index 0000000..0c84336 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/HelloServlet.java @@ -0,0 +1,31 @@ +package com.javarush.babkin.servlets; + +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.io.PrintWriter; + +@WebServlet(name = "helloServlet", value = "/hello-servlet") +public class HelloServlet extends HttpServlet { + private String message; + + public void init() { + message = "Hello World! - это сервлет"; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("text/html"); + + // Hello + PrintWriter out = response.getWriter(); + out.println(""); + out.println("

" + message + "

"); + out.println(""); + } + + public void destroy() { + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/lesson14/controller/IndexServlet.java b/src/main/java/com/javarush/babkin/servlets/IndexServlet.java similarity index 81% rename from src/main/java/com/javarush/khmelov/lesson14/controller/IndexServlet.java rename to src/main/java/com/javarush/babkin/servlets/IndexServlet.java index 702ddaf..6ee0988 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/controller/IndexServlet.java +++ b/src/main/java/com/javarush/babkin/servlets/IndexServlet.java @@ -1,4 +1,4 @@ -package com.javarush.khmelov.lesson14.controller; +package com.javarush.babkin.servlets; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; @@ -8,11 +8,12 @@ import java.io.IOException; -@WebServlet("") +@WebServlet("/index") public class IndexServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - req.setAttribute("source","IndexServlet"); + req.setAttribute("source", "Hello IndexServlet"); req.getRequestDispatcher("/WEB-INF/index.jsp").forward(req, resp); + } } diff --git a/src/main/java/com/javarush/babkin/servlets/QuestListServlet.java b/src/main/java/com/javarush/babkin/servlets/QuestListServlet.java new file mode 100644 index 0000000..92784d0 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/QuestListServlet.java @@ -0,0 +1,39 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.entity.Quest; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +@WebServlet("/quest-list") +public class QuestListServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + + String userIdParam = req.getParameter("userId"); + if (userIdParam == null || userIdParam.trim().isEmpty()) { + resp.sendError(HttpServletResponse.SC_BAD_REQUEST, "userId is required"); + return; + } + Long userId = Long.parseLong(userIdParam); + + List quests = Arrays.asList( + new Quest(1L, "UFO Quest", "Спасти корабль от пришельцев"), + new Quest(2L, "Тайный код", "Расшифровать послание"), + new Quest(3L, "Побег из лаборатории", "Найти выход") + ); + + req.setAttribute("userId", userId); + req.setAttribute("quests", quests); + + req.getRequestDispatcher("/WEB-INF/quest-list.jsp") + .forward(req, resp); + } +} diff --git a/src/main/java/com/javarush/babkin/servlets/QuestServlet.java b/src/main/java/com/javarush/babkin/servlets/QuestServlet.java new file mode 100644 index 0000000..fc4345b --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/QuestServlet.java @@ -0,0 +1,50 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.QuestProgress; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/quest") +public class QuestServlet extends HttpServlet { + private final UserService userService = UserService.USER_SERVICE; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + Long userId = Long.valueOf(req.getParameter("userId")); + QuestProgress progress = userService.getQuestProgress(userId); + + req.setAttribute("progress", progress); + req.setAttribute("userId", userId); // передаём ID в JSP + req.getRequestDispatcher("/WEB-INF/quest.jsp").forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + Long userId = Long.valueOf(req.getParameter("userId")); + String action = req.getParameter("action"); + + QuestProgress progress = userService.getQuestProgress(userId); + + + switch (progress.getStep()) { + case "start": + if ("accept".equals(action)) progress.setStep("accept"); + else if ("decline".equals(action)) { + progress.setStep("decline"); + progress.setFinished(true); + } + break; + } + + userService.updateQuestProgress(userId, progress); + resp.sendRedirect(req.getContextPath() + "/quest?userId=" + userId); + } +} \ No newline at end of file diff --git a/src/main/java/com/javarush/babkin/servlets/RestartServlet.java b/src/main/java/com/javarush/babkin/servlets/RestartServlet.java new file mode 100644 index 0000000..28f3d3d --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/RestartServlet.java @@ -0,0 +1,18 @@ +package com.javarush.babkin.servlets; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/restart") +public class RestartServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.getSession().invalidate(); + resp.sendRedirect("/quest"); + } +} diff --git a/src/main/java/com/javarush/babkin/servlets/StatsServlet.java b/src/main/java/com/javarush/babkin/servlets/StatsServlet.java new file mode 100644 index 0000000..bf16ac2 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/StatsServlet.java @@ -0,0 +1,41 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.service.StatsService; +import com.javarush.babkin.UserDto; +import com.javarush.babkin.UserStatsAdapter; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/stats") +public class StatsServlet extends HttpServlet { + + private final UserService userService = UserService.USER_SERVICE; + private final StatsService statsService = new StatsService(); + + + private final UserStatsAdapter userStatsAdapter = + new UserStatsAdapter(userService, statsService); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + long userId = Long.parseLong(request.getParameter("userId")); + + UserDto user = userStatsAdapter.getUserWithStats(userId); + + if (user == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Пользователь не найден"); + return; + } + + request.setAttribute("user", user); + request.getRequestDispatcher("/user-stats.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/javarush/babkin/servlets/UfoQuestServlet.java b/src/main/java/com/javarush/babkin/servlets/UfoQuestServlet.java new file mode 100644 index 0000000..9390424 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/UfoQuestServlet.java @@ -0,0 +1,29 @@ +package com.javarush.babkin.servlets; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/ufo-quest") +public class UfoQuestServlet extends HttpServlet { + @Override + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + String userIdParam = request.getParameter("userId"); + + if (userIdParam == null || userIdParam.trim().isEmpty()) { + response.sendRedirect(request.getContextPath() + "/user-list"); + return; + } + + request.setAttribute("userId", userIdParam); + request.getRequestDispatcher("/WEB-INF/ufo-quest.jsp") + .forward(request, response); + + } + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/babkin/servlets/UserListServlet.java b/src/main/java/com/javarush/babkin/servlets/UserListServlet.java new file mode 100644 index 0000000..78ea0d0 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/UserListServlet.java @@ -0,0 +1,42 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.QuestProgress; +import com.javarush.babkin.entity.Role; +import com.javarush.babkin.entity.User; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + + +import java.io.IOException; + +@WebServlet(value = {"", "/user-list"}) +public class UserListServlet extends HttpServlet { + private final UserService userService = UserService.USER_SERVICE; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + req.setAttribute("users", userService.getAll()); + req.getRequestDispatcher("/WEB-INF/user-list.jsp").forward(req, resp); + } + + + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + if ("create".equals(req.getParameter("action"))) { + User user = new User(); + user.setLogin(req.getParameter("login")); + user.setPassword(req.getParameter("password")); + user.setRole(Role.valueOf(req.getParameter("role"))); + user.setQuestProgress(new QuestProgress()); + userService.create(user); + } + resp.sendRedirect(req.getContextPath() + "/user-list"); + } +} diff --git a/src/main/java/com/javarush/babkin/servlets/UserStatsServlet.java b/src/main/java/com/javarush/babkin/servlets/UserStatsServlet.java new file mode 100644 index 0000000..8e2a4b1 --- /dev/null +++ b/src/main/java/com/javarush/babkin/servlets/UserStatsServlet.java @@ -0,0 +1,40 @@ +package com.javarush.babkin.servlets; + +import com.javarush.babkin.service.StatsService; +import com.javarush.babkin.UserDto; +import com.javarush.babkin.UserStatsAdapter; +import com.javarush.babkin.service.UserService; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet("/user-stats") +public class UserStatsServlet extends HttpServlet { + private final UserService userService = UserService.USER_SERVICE; + private final StatsService statsService = new StatsService(); // или через DI + + + private final UserStatsAdapter userStatsAdapter = + new UserStatsAdapter(userService, statsService); + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + + long userId = Long.parseLong(request.getParameter("userId")); + + UserDto user = userStatsAdapter.getUserWithStats(userId); + + if (user == null) { + response.sendError(HttpServletResponse.SC_NOT_FOUND, "Пользователь не найден"); + return; + } + + request.setAttribute("user", user); + request.getRequestDispatcher("/user-stats.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/javarush/khmelov/cmd/Command.java b/src/main/java/com/javarush/khmelov/cmd/Command.java new file mode 100644 index 0000000..fd4035b --- /dev/null +++ b/src/main/java/com/javarush/khmelov/cmd/Command.java @@ -0,0 +1,37 @@ +package com.javarush.khmelov.cmd; + +import jakarta.servlet.http.HttpServletRequest; + +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public interface Command { + + default String doGet(HttpServletRequest request) { + return getView(); + } + + default String doPost(HttpServletRequest request) { + return getView(); + } + + default String getView() { + String simpleName = this.getClass().getSimpleName(); + return convertCamelCaseToKebabStyle(simpleName); + } + + private static String convertCamelCaseToKebabStyle(String string) { + String snakeName = string.chars() + .mapToObj(s -> String.valueOf((char) s)) + .flatMap(s -> s.matches("[A-Z]") + ? Stream.of("-", s) + : Stream.of(s)) + .collect(Collectors.joining()) + .toLowerCase(); + return snakeName.startsWith("-") + ? snakeName.substring(1) + : snakeName; + } + + +} diff --git a/src/main/java/com/javarush/khmelov/cmd/EditUser.java b/src/main/java/com/javarush/khmelov/cmd/EditUser.java new file mode 100644 index 0000000..ae191b4 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/cmd/EditUser.java @@ -0,0 +1,52 @@ +package com.javarush.khmelov.cmd; + +import com.javarush.khmelov.entity.Role; +import com.javarush.khmelov.entity.User; +import com.javarush.khmelov.service.UserService; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Optional; + + +@SuppressWarnings("unused") +public class EditUser implements Command { + + private final UserService userService; + + public EditUser(UserService userService) { + this.userService = userService; + } + + + @Override + public String doGet(HttpServletRequest req) { + String stringId = req.getParameter("id"); + if (stringId != null) { + long id = Long.parseLong(stringId); + Optional optionalUser = userService.get(id); + if (optionalUser.isPresent()) { + User user = optionalUser.get(); + req.setAttribute("user", user); + } + } + return getView(); + } + + @Override + public String doPost(HttpServletRequest req) { + User user = User.builder() + .login(req.getParameter("login")) + .password(req.getParameter("password")) + .role(Role.valueOf(req.getParameter("role"))) + .build(); + if (req.getParameter("create") != null) { + userService.create(user); + } else if (req.getParameter("update") != null) { + user.setId(Long.parseLong(req.getParameter("id"))); + userService.update(user); + } + return getView() + "?id=" + user.getId(); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/cmd/ListUser.java b/src/main/java/com/javarush/khmelov/cmd/ListUser.java new file mode 100644 index 0000000..9257917 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/cmd/ListUser.java @@ -0,0 +1,26 @@ +package com.javarush.khmelov.cmd; + +import com.javarush.khmelov.entity.User; +import com.javarush.khmelov.service.UserService; +import jakarta.servlet.http.HttpServletRequest; + +import java.util.Collection; + +@SuppressWarnings("unused") +public class ListUser implements Command { + + private final UserService userService; + + public ListUser(UserService userService) { + this.userService = userService; + } + + @Override + public String doGet(HttpServletRequest request) { + Collection users = userService.getAll(); + request.setAttribute("users", users); + return getView(); + } + + +} \ No newline at end of file diff --git a/src/main/java/com/javarush/khmelov/cmd/StartPage.java b/src/main/java/com/javarush/khmelov/cmd/StartPage.java new file mode 100644 index 0000000..d268f93 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/cmd/StartPage.java @@ -0,0 +1,6 @@ +package com.javarush.khmelov.cmd; + +@SuppressWarnings("unused") +public class StartPage implements Command { + +} diff --git a/src/main/java/com/javarush/khmelov/config/Winter.java b/src/main/java/com/javarush/khmelov/config/Winter.java new file mode 100644 index 0000000..48bd8a7 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/config/Winter.java @@ -0,0 +1,29 @@ +package com.javarush.khmelov.config; + +import lombok.SneakyThrows; + +import java.lang.reflect.Constructor; +import java.util.concurrent.ConcurrentHashMap; + +public class Winter { + + public static ConcurrentHashMap, Object> components = new ConcurrentHashMap<>(); + + + @SuppressWarnings("unchecked") + @SneakyThrows + public static T find(Class aClass) { + Object component = components.get(aClass); + if (component == null) { + Constructor constructor = aClass.getConstructors()[0]; + Class[] parameterTypes = constructor.getParameterTypes(); + Object[] parameters = new Object[parameterTypes.length]; + for (int i = 0; i < parameters.length; i++) { + parameters[i] = Winter.find(parameterTypes[i]); + } + Object newInstance = constructor.newInstance(parameters); + components.put(aClass, newInstance); + } + return (T) components.get(aClass); + } +} diff --git a/src/main/java/com/javarush/khmelov/controller/FrontController.java b/src/main/java/com/javarush/khmelov/controller/FrontController.java new file mode 100644 index 0000000..33242b2 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/controller/FrontController.java @@ -0,0 +1,43 @@ +package com.javarush.khmelov.controller; + +import com.javarush.khmelov.cmd.Command; +import com.javarush.khmelov.config.Winter; +import com.javarush.khmelov.entity.Role; +import jakarta.servlet.ServletConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +import java.io.IOException; + +@WebServlet({"", "/home", "/list-user", "/edit-user"}) +public class FrontController extends HttpServlet { + + private final HttpResolver httpResolver = Winter.find(HttpResolver.class); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Command command = httpResolver.resolve(req); + String view = command.doGet(req); + String jsp = getJsp(view); + req.getRequestDispatcher(jsp).forward(req, resp); + } + + @Override + public void init(ServletConfig config) { + config.getServletContext().setAttribute("roles", Role.values()); + } + + private static String getJsp(String view) { + return "/WEB-INF/" + view + ".jsp"; + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + Command command = httpResolver.resolve(req); + String redirect = command.doPost(req); + resp.sendRedirect(redirect); + } +} diff --git a/src/main/java/com/javarush/khmelov/controller/HttpResolver.java b/src/main/java/com/javarush/khmelov/controller/HttpResolver.java new file mode 100644 index 0000000..18bb761 --- /dev/null +++ b/src/main/java/com/javarush/khmelov/controller/HttpResolver.java @@ -0,0 +1,41 @@ +package com.javarush.khmelov.controller; + +import com.javarush.khmelov.cmd.Command; +import com.javarush.khmelov.config.Winter; +import jakarta.servlet.http.HttpServletRequest; + +public class HttpResolver { + + public Command resolve(HttpServletRequest request) { + // /cmd-example + try { + String requestURI = request.getRequestURI(); + requestURI = requestURI.equals("/") ? "/start-page" : requestURI; + String kebabName = requestURI.split("[?#/]")[1]; + String simpleName = convertKebabStyleToCamelCase(kebabName); + String fullName = Command.class.getPackageName() + "." + simpleName; + Class aClass = Class.forName(fullName); + return (Command) Winter.find(aClass); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + + private String convertKebabStyleToCamelCase(String input) { + StringBuilder result = new StringBuilder(); + boolean capitalizeNext = true; + for (char c : input.toCharArray()) { + if (c == '-') { + capitalizeNext = true; + } else { + if (capitalizeNext) { + result.append(Character.toUpperCase(c)); + capitalizeNext = false; + } else { + result.append(Character.toLowerCase(c)); + } + } + } + return result.toString(); + } +} diff --git a/src/main/java/com/javarush/khmelov/entity/Role.java b/src/main/java/com/javarush/khmelov/entity/Role.java new file mode 100644 index 0000000..5ae365f --- /dev/null +++ b/src/main/java/com/javarush/khmelov/entity/Role.java @@ -0,0 +1,5 @@ +package com.javarush.khmelov.entity; + +public enum Role { + USER, ADMIN, GUEST +} diff --git a/src/main/java/com/javarush/khmelov/lesson14/entity/User.java b/src/main/java/com/javarush/khmelov/entity/User.java similarity index 89% rename from src/main/java/com/javarush/khmelov/lesson14/entity/User.java rename to src/main/java/com/javarush/khmelov/entity/User.java index 96e8153..f7fa2d6 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/entity/User.java +++ b/src/main/java/com/javarush/khmelov/entity/User.java @@ -1,4 +1,4 @@ -package com.javarush.khmelov.lesson14.entity; +package com.javarush.khmelov.entity; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/com/javarush/khmelov/lesson14/config/Winter.java b/src/main/java/com/javarush/khmelov/lesson14/config/Winter.java deleted file mode 100644 index 667b058..0000000 --- a/src/main/java/com/javarush/khmelov/lesson14/config/Winter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.javarush.khmelov.lesson14.config; - -import lombok.SneakyThrows; - -import java.lang.reflect.Constructor; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class Winter { - - private Winter() { - - } - - private static final Map, Object> beans = new ConcurrentHashMap<>(); - - @SneakyThrows - public static T find(Class clazz) { - if (!beans.containsKey(clazz)) { - Constructor constructor = clazz.getConstructors()[0]; - Class[] parameterTypes = constructor.getParameterTypes(); - Object[] parameters = new Object[parameterTypes.length]; - for (int i = 0; i < parameterTypes.length; i++) { - parameters[i] = find(parameterTypes[i]); - } - beans.put(clazz, constructor.newInstance(parameters)); - } - //noinspection unchecked - return (T) beans.get(clazz); - } -} diff --git a/src/main/java/com/javarush/khmelov/lesson14/entity/Role.java b/src/main/java/com/javarush/khmelov/lesson14/entity/Role.java deleted file mode 100644 index 5871424..0000000 --- a/src/main/java/com/javarush/khmelov/lesson14/entity/Role.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.javarush.khmelov.lesson14.entity; - -public enum Role { - USER, ADMIN, GUEST -} diff --git a/src/main/java/com/javarush/khmelov/repository/Repository.java b/src/main/java/com/javarush/khmelov/repository/Repository.java new file mode 100644 index 0000000..f1abdac --- /dev/null +++ b/src/main/java/com/javarush/khmelov/repository/Repository.java @@ -0,0 +1,19 @@ +package com.javarush.khmelov.repository; + +import com.javarush.khmelov.entity.User; + +import java.util.Collection; +import java.util.Optional; + +public interface Repository { + + Collection getAll(); + + Optional get(long id); + + void create(T entity); + + void update(T entity); + + void delete(T entity); +} diff --git a/src/main/java/com/javarush/khmelov/lesson14/repository/UserRepository.java b/src/main/java/com/javarush/khmelov/repository/UserRepository.java similarity index 88% rename from src/main/java/com/javarush/khmelov/lesson14/repository/UserRepository.java rename to src/main/java/com/javarush/khmelov/repository/UserRepository.java index 677450a..58b32ea 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/repository/UserRepository.java +++ b/src/main/java/com/javarush/khmelov/repository/UserRepository.java @@ -1,7 +1,7 @@ -package com.javarush.khmelov.lesson14.repository; +package com.javarush.khmelov.repository; -import com.javarush.khmelov.lesson14.entity.Role; -import com.javarush.khmelov.lesson14.entity.User; +import com.javarush.khmelov.entity.Role; +import com.javarush.khmelov.entity.User; import java.util.Collection; import java.util.HashMap; diff --git a/src/main/java/com/javarush/khmelov/lesson14/service/UserService.java b/src/main/java/com/javarush/khmelov/service/UserService.java similarity index 80% rename from src/main/java/com/javarush/khmelov/lesson14/service/UserService.java rename to src/main/java/com/javarush/khmelov/service/UserService.java index c472b39..b17527c 100644 --- a/src/main/java/com/javarush/khmelov/lesson14/service/UserService.java +++ b/src/main/java/com/javarush/khmelov/service/UserService.java @@ -1,7 +1,7 @@ -package com.javarush.khmelov.lesson14.service; +package com.javarush.khmelov.service; -import com.javarush.khmelov.lesson14.entity.User; -import com.javarush.khmelov.lesson14.repository.UserRepository; +import com.javarush.khmelov.entity.User; +import com.javarush.khmelov.repository.UserRepository; import java.util.Collection; import java.util.Optional; diff --git a/src/main/webapp/WEB-INF/create-user.jsp b/src/main/webapp/WEB-INF/create-user.jsp new file mode 100644 index 0000000..cd05822 --- /dev/null +++ b/src/main/webapp/WEB-INF/create-user.jsp @@ -0,0 +1,63 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@include file="head.jsp" %> + + + Title + + +

Создание пользователя

+
+
+
+ + + ${requestScope.user != null ? 'Edit user: ' + requestScope.user.login : 'Create user'} + +
+ +
+ +
+
+ +
+ +
+ +
+
+ + +
+ +
+ +
+
+ + +
+ +
+ +
+ + +
+ +
+
+ + +
+
+
+ + diff --git a/src/main/webapp/WEB-INF/edit-user.jsp b/src/main/webapp/WEB-INF/edit-user.jsp index f274104..6c9877b 100644 --- a/src/main/webapp/WEB-INF/edit-user.jsp +++ b/src/main/webapp/WEB-INF/edit-user.jsp @@ -1,73 +1,66 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@include file="head.jsp" %> - -
-
-
- - - Edit user: - - -
- -
- - min 3 symbols -
+<%@ page contentType="text/html;charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@include file="head.jsp"%> + + + + + +
+ Edit user: ${user.login} + + +
+ +
+
+
+ - -
- -
- - min 8 symb -
+
+ +
+
+
- -
- -
- -
+
+ +
+
+
- -
- -
- - - - - - - -
+ +
+ +
+ + + +
+
+ +
+ + + -
- -
- + +
${error}
+
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/head.jsp b/src/main/webapp/WEB-INF/head.jsp index 3cc7055..407565d 100644 --- a/src/main/webapp/WEB-INF/head.jsp +++ b/src/main/webapp/WEB-INF/head.jsp @@ -1,11 +1,16 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> - +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> - Title - + + UFO Quest + - \ No newline at end of file + + + + diff --git a/src/main/webapp/WEB-INF/index.jsp b/src/main/webapp/WEB-INF/index.jsp index 0531c1c..d555c84 100644 --- a/src/main/webapp/WEB-INF/index.jsp +++ b/src/main/webapp/WEB-INF/index.jsp @@ -1,8 +1,54 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@include file="head.jsp"%> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + Регистрация + + + -

<%= "Hello World!" %> -

-
-List Users +
+

Регистрация пользователя

+
+
+ + +
+ +
+
+ \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/list-user.jsp b/src/main/webapp/WEB-INF/list-user.jsp deleted file mode 100644 index dd52c55..0000000 --- a/src/main/webapp/WEB-INF/list-user.jsp +++ /dev/null @@ -1,9 +0,0 @@ -<%@ page contentType="text/html;charset=UTF-8" language="java" %> -<%@include file="head.jsp"%> - - - ${user.login} - - - - diff --git a/src/main/webapp/WEB-INF/quest-list.jsp b/src/main/webapp/WEB-INF/quest-list.jsp new file mode 100644 index 0000000..f3e5d09 --- /dev/null +++ b/src/main/webapp/WEB-INF/quest-list.jsp @@ -0,0 +1,54 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@include file="head.jsp"%> + + + Выбор квеста + + +
+

Выберите квест для пользователя #${userId}

+ + +

Квесты отсутствуют.

+
+ +
+ +
+
+
+
${quest.title}
+

${quest.description}

+ + + + + + Начать UFO Quest + + + + + Начать + + + +
+
+
+
+
+ + + +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/quest.jsp b/src/main/webapp/WEB-INF/quest.jsp new file mode 100644 index 0000000..536cc97 --- /dev/null +++ b/src/main/webapp/WEB-INF/quest.jsp @@ -0,0 +1,149 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + UFO quest + + + + + +

UFO quest — это UFO quest

+ +
+ + + + +

Ты потерял память.

+
+ + +
+
+ + + +

Ты принял вызов.

+

Поднимаешься на мостик к капитану?

+
+ + +
+
+ + + +

Ты отклонил вызов.

+

Поражение.

+
+ + +
+ + + Назад к списку + +
+ + + +

Ты не пошёл на переговоры.

+

Поражение.

+
+ + +
+ + + Назад к списку + +
+ + + +

Ты поднялся на мостик.

+

Рассказать правду о себе или солгать?

+
+ + +
+
+ + + +

Ты рассказал правду.

+

Капитан поверил и помог восстановить память.

+

Тебя вернули домой.

+

Победа!

+
+ + +
+ + + Назад к списку + +
+ + + +

Ты солгал.

+

Твою ложь разоблачили.

+

Поражение.

+
+ + +
+ + + Назад к списку + +
+ +
+
+ + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/stats.jsp b/src/main/webapp/WEB-INF/stats.jsp new file mode 100644 index 0000000..07af35a --- /dev/null +++ b/src/main/webapp/WEB-INF/stats.jsp @@ -0,0 +1,13 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +Статистика игрока + +

Статистика игрока ${stats.playerId}

+
    +
  • Всего игр: ${stats.totalGames}
  • +
  • Побед: ${stats.wins}
  • +
  • Поражений: ${stats.losses}
  • +
  • Винрейт: %
  • +
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/ufo-quest.jsp b/src/main/webapp/WEB-INF/ufo-quest.jsp new file mode 100644 index 0000000..7cbbf27 --- /dev/null +++ b/src/main/webapp/WEB-INF/ufo-quest.jsp @@ -0,0 +1,131 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + UFO quest + + + + +

UFO Quest (Пользователь #${userId})

+

Ты потерял память.

+ +
+ + + + + + + Назад к списку + + + +
+ +
+ + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/user-list.jsp b/src/main/webapp/WEB-INF/user-list.jsp new file mode 100644 index 0000000..d7318bb --- /dev/null +++ b/src/main/webapp/WEB-INF/user-list.jsp @@ -0,0 +1,70 @@ +<%@ page contentType="text/html;charset=UTF-8" %> +<%@include file="head.jsp"%> + +
+

Список пользователей

+
+
    + < + + + <%@ page contentType="text/html;charset=UTF-8" %> + <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> + <%@include file="head.jsp"%> + + + + + + + + + <%-- --%> + <%-- --%> + + + + + + + + + + + + + + <%-- --%> + + <%-- --%> + + + + + + + +
    IDЛогинРольИгр сыграноПобеды Поражения Последняя играДействия
    ${user.id}${user.login}${user.role}${user.gameHistory.size()}${user.wins}${user.losses} + + + + + Нет игр + + + Редактировать + Выбрать квест +
    + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/user-stats.jsp b/src/main/webapp/WEB-INF/user-stats.jsp new file mode 100644 index 0000000..ed65f9e --- /dev/null +++ b/src/main/webapp/WEB-INF/user-stats.jsp @@ -0,0 +1,17 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + +Статистика пользователя + +

    Профиль: ${user.login}

    + +
    +

    Всего игр: ${user.stats.totalGames}

    +

    Побед: ${user.stats.wins}

    +

    Поражений: ${user.stats.losses}

    +

    Винрейт: %

    +
    + +Назад к списку + + \ No newline at end of file diff --git a/src/main/webapp/images/logo.png b/src/main/webapp/images/logo.png deleted file mode 100644 index e69de29..0000000