//Implements the users repository using JDBC package Team5.SmartTowns.users; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.object.SqlQuery; import org.springframework.stereotype.Repository; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.HashMap; import java.util.List; import java.util.Objects; @Repository public class UserRepositoryJDBC implements UserRepository{ private final JdbcTemplate jdbc; private RowMapper<User> userMapper; public UserRepositoryJDBC(JdbcTemplate aJdbc){ this.jdbc = aJdbc; setUserMapper(); } private void setUserMapper(){ userMapper = (rs, i) -> new User( rs.getString("email"), rs.getString("username") ); } @Override public List<User> getAllUsers(){ String sql= "SELECT * FROM users"; return jdbc.query(sql, userMapper); } @Override public List<Long> getUserStickersFromPack(String username, int packID) { /* Returns a list with the stickerIDs of stickers that the specified user has unlocked from the given pack */ String sql = "SELECT stickerID FROM stickerprogress WHERE (username, packID)= (?,?)"; return jdbc.queryForList(sql, Long.class, username, packID); } @Override public boolean unlockSticker(String username, int packID, int stickerID){ /* Adds entry in the stickerprogress database, effectively unlocking the sticker for the user * Returns false if no sticker is unlocked */ String query = "SELECT COUNT(id) FROM stickers WHERE (stickerID, packID) = (?, ?)"; int stickerCount = jdbc.queryForObject(query, Integer.class, stickerID, packID); if (stickerCount == 1){ //Checks if sticker exists String sql = "INSERT INTO stickerprogress (username, packID, stickerID) VALUES (?,?,?)"; jdbc.update(sql, username, packID, stickerID); return true; } return false; } @Override public boolean addUser(String username, String email, String password) throws DataAccessException{ /* Adds new user to the database */ String query = "INSERT INTO users (username, email, password) VALUES (?, ?, ?);"; String query2= "INSERT INTO authorities (username, authority) VALUES (?,?);"; jdbc.update(query, username, email, password); jdbc.update(query2, username, "USER"); return true; } @Override public boolean doesUserExist(String email){ /* Returns true if a user with given email already exists in the database */ String query = "SELECT COUNT(email) FROM users WHERE (email) = (?)"; return !(jdbc.queryForObject(query, Integer.class, email) == 0); } @Override public User findUserByEmail(String email) { /* Finds user matching given email */ String query = "SELECT * FROM users WHERE (email) = (?)"; List<User> result = jdbc.query(query, userMapper, email); return result.isEmpty() ? null : result.get(0); } @Override public User findUserByName(String name) { /* Finds user matching given name */ String query = "SELECT * FROM users WHERE (username) = (?)"; List<User> result = jdbc.query(query, userMapper, name); return result.isEmpty() ? null : result.get(0); } }