package repository; import dto.TaskCreateDto; import dto.TaskUpdateDto; import models.Task; import models.User; import util.Session; import java.sql.*; import java.util.ArrayList; import java.util.Date; import java.util.Optional; public class TaskRepositoryJdbc implements TaskRepository { private final Connection connection; public TaskRepositoryJdbc(Connection connection) { this.connection = connection; } @Override public ArrayList getUserTasks() { try { User user = Session.getInstance().getUser(); if (user == null) return new ArrayList<>(); PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM tasks WHERE user_id=(?)" ); preparedStatement.setInt(1, user.id()); ResultSet resultSet = preparedStatement.executeQuery(); ArrayList tasks = new ArrayList<>(); while (resultSet.next()) { Task.Status status = Task.Status.valueOf(resultSet.getString("status")); Task task = new Task( resultSet.getInt("id"), resultSet.getString("title"), resultSet.getString("description"), status, resultSet.getTimestamp("deadline"), resultSet.getTimestamp("created_at"), user ); tasks.add(task); } return tasks; } catch (SQLException ex) { ex.printStackTrace(); return new ArrayList<>(); } } @Override public ArrayList getUserTasks(Date startDate, Date endDate) { try { User user = Session.getInstance().getUser(); if (user == null) return new ArrayList<>(); PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM tasks WHERE user_id=(?) AND created_at BETWEEN (?) AND (?)" ); preparedStatement.setInt(1, user.id()); preparedStatement.setDate(2, new java.sql.Date(startDate.getTime())); preparedStatement.setDate(3, new java.sql.Date(endDate.getTime())); ResultSet resultSet = preparedStatement.executeQuery(); ArrayList tasks = new ArrayList<>(); while (resultSet.next()) { Task.Status status = Task.Status.valueOf(resultSet.getString("status")); Task task = new Task( resultSet.getInt("id"), resultSet.getString("title"), resultSet.getString("description"), status, resultSet.getTimestamp("deadline"), resultSet.getTimestamp("created_at"), user ); tasks.add(task); } return tasks; } catch (SQLException ex) { ex.printStackTrace(); return new ArrayList<>(); } } @Override public ArrayList getUserTasks(String title) { try { User user = Session.getInstance().getUser(); if (user == null) return new ArrayList<>(); PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM tasks WHERE user_id=(?) AND title ILIKE (?)" ); preparedStatement.setInt(1, user.id()); preparedStatement.setString(2, "%" + title + "%"); ResultSet resultSet = preparedStatement.executeQuery(); ArrayList tasks = new ArrayList<>(); while (resultSet.next()) { Task.Status status = Task.Status.valueOf(resultSet.getString("status")); Task task = new Task( resultSet.getInt("id"), resultSet.getString("title"), resultSet.getString("description"), status, resultSet.getTimestamp("deadline"), resultSet.getTimestamp("created_at"), user ); tasks.add(task); } return tasks; } catch (SQLException ex) { ex.printStackTrace(); return new ArrayList<>(); } } @Override public Optional getUserTask(int taskId) { try { User user = Session.getInstance().getUser(); if (user == null) return Optional.empty(); PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM tasks WHERE id=(?) AND user_id=(?)" ); preparedStatement.setInt(1, taskId); preparedStatement.setInt(2, user.id()); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { Task.Status status = Task.Status.valueOf(resultSet.getString("status")); Task task = new Task( resultSet.getInt("id"), resultSet.getString("title"), resultSet.getString("description"), status, resultSet.getTimestamp("deadline"), resultSet.getTimestamp("created_at"), user ); return Optional.of(task); } return Optional.empty(); } catch (SQLException ex) { ex.printStackTrace(); return Optional.empty(); } } @Override public Optional save(TaskCreateDto taskCreateDto) { try { User user = Session.getInstance().getUser(); if (user == null) return Optional.empty(); PreparedStatement preparedStatement = connection.prepareStatement( "INSERT INTO tasks (title, description, status, deadline) VALUES (?, ?, ?, ?) RETURNING id, created_at" ); preparedStatement.setString(1, taskCreateDto.title()); preparedStatement.setString(2, taskCreateDto.description()); preparedStatement.setObject(3, taskCreateDto.status().name(), Types.OTHER); Date deadline = taskCreateDto.deadline(); if (deadline != null) { preparedStatement.setDate(4, new java.sql.Date(deadline.getTime())); } else { preparedStatement.setNull(4, java.sql.Types.DATE); } System.out.println(preparedStatement); ResultSet resultSet = preparedStatement.executeQuery(); System.out.println(resultSet); if (resultSet.next()) { System.out.println(resultSet.getString("id")); Task task = new Task( resultSet.getInt("id"), taskCreateDto.title(), taskCreateDto.description(), taskCreateDto.status(), taskCreateDto.deadline(), resultSet.getTimestamp("created_at"), user ); return Optional.of(task); } return Optional.empty(); } catch (SQLException ex) { ex.printStackTrace(); return Optional.empty(); } } @Override public Optional update(TaskUpdateDto taskUpdateDto) { try { User user = Session.getInstance().getUser(); if (user == null) return Optional.empty(); PreparedStatement preparedStatement = connection.prepareStatement( "UPDATE tasks SET title=?, description=?, status=?, deadline=? WHERE id=? AND user_id=(?) RETURNING id, created_at;" ); preparedStatement.setString(1, taskUpdateDto.title()); preparedStatement.setString(2, taskUpdateDto.description()); preparedStatement.setObject(3, taskUpdateDto.status().name(), Types.OTHER); Date deadline = taskUpdateDto.deadline(); if (deadline != null) { preparedStatement.setDate(4, new java.sql.Date(deadline.getTime())); } else { preparedStatement.setNull(4, java.sql.Types.DATE); } preparedStatement.setInt(5, taskUpdateDto.id()); preparedStatement.setInt(6, user.id()); ResultSet resultSet = preparedStatement.executeQuery(); if (resultSet.next()) { Task task = new Task( resultSet.getInt("id"), taskUpdateDto.title(), taskUpdateDto.description(), taskUpdateDto.status(), taskUpdateDto.deadline(), resultSet.getTimestamp("created_at"), user ); return Optional.of(task); } return Optional.empty(); } catch (SQLException ex) { ex.printStackTrace(); return Optional.empty(); } } @Override public boolean delete(int taskId) { try { User user = Session.getInstance().getUser(); if (user == null) return false; PreparedStatement preparedStatement = connection.prepareStatement( "DELETE FROM tasks WHERE id=(?) AND user_id=(?);" ); preparedStatement.setInt(1, taskId); preparedStatement.setInt(2, user.id()); int affected = preparedStatement.executeUpdate(); if (affected > 0) { return false; } return true; } catch (SQLException ex) { ex.printStackTrace(); return false; } } }