Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 6ba63156

Přidáno uživatelem Jakub Danek před více než 5 roky(ů)

re #37 reimplement UserRepository getUser queries back into sanity

Add possibility to search by email.

Zobrazit rozdíly:

server/src/main/java/org/danekja/ymanager/repository/RepositoryUtils.java
1
package org.danekja.ymanager.repository;
2

  
3
import org.springframework.dao.IncorrectResultSizeDataAccessException;
4

  
5
import java.util.List;
6

  
7
public class RepositoryUtils {
8

  
9
    /**
10
     * Method which extracts single result from a list which is expected to contains 0 or 1 results.
11
     *
12
     * @param queryResult query result in form of {@link List}
13
     * @param <T>         type of object expected in the list
14
     * @return the object from the list or null (when empty)
15
     * @throws IncorrectResultSizeDataAccessException when #queryResult contains more than 1 object
16
     */
17
    public static <T> T singleResult(List<T> queryResult) {
18
        switch (queryResult.size()) {
19
            case 0:
20
                return null;
21
            case 1:
22
                return queryResult.get(0);
23
            default:
24
                throw new IncorrectResultSizeDataAccessException(1, queryResult.size());
25
        }
26
    }
27
}
server/src/main/java/org/danekja/ymanager/repository/UserRepository.java
2 2

  
3 3
import org.danekja.ymanager.domain.User;
4 4
import org.danekja.ymanager.dto.*;
5
import org.danekja.ymanager.repository.jdbc.mappers.UserRowMapper;
5 6
import org.slf4j.Logger;
6 7
import org.slf4j.LoggerFactory;
7 8
import org.springframework.beans.factory.annotation.Autowired;
......
25 26
@Repository
26 27
public class UserRepository {
27 28

  
29
    private final RowMapper<User> USER_MAPPER = new UserRowMapper();
30

  
28 31
    /**
29 32
     * The mapper maps a row from a result of a query to an BasicProfileUser.
30 33
     */
......
228 231

  
229 232
    }
230 233

  
231
    public FullUserProfile getFullUser(final String token) {
232
        UserRepository.log.trace("Selecting full profile of a user with the specified token from a database: {}", token);
233

  
234
        final Map<String, Object> resultMap = this.getUserColumns(token);
235

  
236
        final FullUserProfile user = new FullUserProfile();
237
        user.setId((Long) resultMap.get("out_id"));
238
        user.setFirstName((String) resultMap.get("out_first_name"));
239
        user.setLastName((String) resultMap.get("out_last_name"));
240
        user.setVacationCount(((Double) resultMap.get("out_no_vacations")).floatValue());
241
        user.setSickDayCount((Integer) resultMap.get("out_no_sick_days"));
242
        user.setTakenSickDayCount((Integer) resultMap.get("out_taken_sick_days"));
243
        user.setNotification(((Timestamp) resultMap.get("out_alert")).toLocalDateTime());
244
        user.setEmail((String) resultMap.get(("out_email")));
245
        user.setPhoto((String) resultMap.get("out_photo"));
246
        user.setRole(getUserRole((String) resultMap.get("out_role")));
247
        user.setStatus(Status.getStatus((String) resultMap.get("out_status")));
248
        return user;
249
    }
250 234

  
251 235
    public Optional<DefaultSettings> getLastDefaultSettings() {
252 236
        return Optional.ofNullable(this.jdbc.queryForObject("SELECT * FROM default_settings ORDER BY id DESC LIMIT 1", new DefaultSettingsMapper()));
......
254 238

  
255 239
    //---------------------------------- DOMAIN -----------------------------------
256 240

  
241
    /**
242
     * Gets user from database based on its email
243
     *
244
     * @param email email value, used as search key
245
     * @return found user object or null (if not found)
246
     */
247
    public User getUser(final String email) {
248
        List<User> users = this.jdbc.query("SELECT * FROM end_user WHERE email = ?", USER_MAPPER, email);
249

  
250
        return RepositoryUtils.singleResult(users);
251
    }
252

  
253
    /**
254
     * Gets user from database based on its id
255
     *
256
     * @param id id value, used as search key
257
     * @return found user object or null (if not found)
258
     */
257 259
    public User getUser(final long id) {
258
        final Map<String, Object> resultMap = this.getUserColumns(id);
259
        User user = new User();
260
        user.setId((Long) resultMap.get("out_id"));
261
        user.setFirstName((String)resultMap.get("out_first_name"));
262
        user.setLastName((String)resultMap.get("out_last_name"));
263
        user.setVacationCount(((Double)resultMap.get("out_no_vacations")).floatValue());
264
        user.setTotalSickDayCount((Integer)resultMap.get("out_no_sick_days"));
265
        user.setTakenSickDayCount((Integer)resultMap.get("out_taken_sick_days"));
266
        user.setNotification(((Timestamp)resultMap.get("out_alert")).toLocalDateTime());
267
        user.setToken((String)resultMap.get("out_token"));
268
        user.setEmail((String)resultMap.get("out_email"));
269
        user.setPhoto((String)resultMap.get("out_photo"));
270
        user.setCreationDate(((Timestamp)resultMap.get("out_creation_date")).toLocalDateTime());
271
        user.setRole(getUserRole((String)resultMap.get("out_role")));
272
        user.setStatus(Status.getStatus((String)resultMap.get("out_status")));
273
        return user;
260
        List<User> users = this.jdbc.query("SELECT * FROM end_user WHERE id = ?", USER_MAPPER, id);
261

  
262
        return RepositoryUtils.singleResult(users);
274 263
    }
275 264

  
276 265
    public void updateUser(final User user) {
server/src/main/java/org/danekja/ymanager/repository/jdbc/mappers/UserRowMapper.java
1
package org.danekja.ymanager.repository.jdbc.mappers;
2

  
3
import org.danekja.ymanager.domain.User;
4
import org.danekja.ymanager.dto.Status;
5
import org.danekja.ymanager.dto.UserRole;
6
import org.springframework.jdbc.core.RowMapper;
7

  
8
import java.sql.ResultSet;
9
import java.sql.SQLException;
10
import java.sql.Timestamp;
11
import java.time.LocalDateTime;
12

  
13
/**
14
 * Maps "end_user" query rows into User object.
15
 */
16
public class UserRowMapper implements RowMapper<User> {
17

  
18
    @Override
19
    public User mapRow(ResultSet resultSet, int i) throws SQLException {
20
        Long id = resultSet.getLong("id");
21
        String firstName = resultSet.getString("first_name");
22
        String lastName = resultSet.getString("last_name");
23
        float vacations = resultSet.getFloat("no_vacations");
24
        int sickDays = resultSet.getInt("no_sick_days");
25
        int takenSickDays = resultSet.getInt("taken_sick_days");
26

  
27
        Timestamp date = resultSet.getTimestamp("alert");
28
        LocalDateTime alert = date != null ? ((Timestamp) date).toLocalDateTime() : null;
29

  
30
        String token = resultSet.getNString("token");
31
        String email = resultSet.getString("email");
32
        String photo = resultSet.getNString("photo");
33

  
34
        date = resultSet.getTimestamp("creation_date");
35
        LocalDateTime creationDate = date.toLocalDateTime();
36
        UserRole role = UserRole.valueOf(resultSet.getString("user_role"));
37
        Status status = Status.valueOf(resultSet.getString("status"));
38

  
39
        return new User(id, firstName, lastName, vacations, sickDays, takenSickDays, alert, token, email, photo, creationDate, role, status);
40
    }
41
}

Také k dispozici: Unified diff