Projekt

Obecné

Profil

Stáhnout (6.98 KB) Statistiky
| Větev: | Tag: | Revize:
1
package cz.zcu.kiv.backendapi.user;
2

    
3
import cz.zcu.kiv.backendapi.exception.ApiRequestException;
4
import cz.zcu.kiv.backendapi.password.PasswordDto;
5
import lombok.RequiredArgsConstructor;
6
import lombok.extern.slf4j.Slf4j;
7
import org.springframework.http.HttpStatus;
8
import org.springframework.security.core.context.SecurityContextHolder;
9
import org.springframework.security.core.userdetails.UserDetails;
10
import org.springframework.security.core.userdetails.UserDetailsService;
11
import org.springframework.security.core.userdetails.UsernameNotFoundException;
12
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
13
import org.springframework.stereotype.Service;
14
import org.springframework.transaction.annotation.Transactional;
15
import cz.zcu.kiv.backendapi.permission.PermissionDto;
16

    
17
import java.util.List;
18
import java.util.stream.Collectors;
19

    
20
/**
21
 * User service implementation
22
 */
23
@Service
24
@Transactional
25
@RequiredArgsConstructor
26
@Slf4j
27
public class UserServiceImpl implements IUserService, UserDetailsService {
28
    /**
29
     * Message for exception when user is not found by username
30
     */
31
    private static final String USER_NOT_FOUND = "User with username %s not found";
32

    
33
    /**
34
     * User repository
35
     */
36
    private final UserRepository userRepository;
37

    
38
    /**
39
     * Password encoder
40
     */
41
    private final BCryptPasswordEncoder bCryptPasswordEncoder;
42

    
43

    
44
    @Override
45
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
46
        return userRepository.findByEmail(username)
47
                .orElseThrow(() -> {
48
                    log.error(String.format(USER_NOT_FOUND, username));
49
                    throw new UsernameNotFoundException(String.format(USER_NOT_FOUND, username));
50
                });
51
    }
52

    
53
    @Override
54
    public UserEntity getUserByName(String username) {
55
        return userRepository.findByEmail(username).orElseThrow(() -> {
56
            log.error(String.format(USER_NOT_FOUND, username));
57
            throw new UsernameNotFoundException(String.format(USER_NOT_FOUND, username));
58
        });
59
    }
60

    
61
    @Override
62
    public void registerNewUser(UserDto userDto) {
63
        if (userRepository.findByEmail(userDto.getEmail()).isPresent()) {
64
            log.error("Trying to register new user with username that is already taken: " + userDto.getEmail());
65
            throw new ApiRequestException(String.format("User with username %s already exists", userDto.getEmail()), HttpStatus.CONFLICT);
66
        }
67
        UserEntity userEntity = new UserEntity();
68
        convertDtoToEntity(userDto, userEntity);
69
        userRepository.save(userEntity);
70
    }
71

    
72
    @Override
73
    public void updatePermissions(String username, PermissionDto permissionDto) {
74
        UserEntity userEntity = userRepository.findByEmail(username).orElseThrow(() ->{
75
            log.error(String.format(USER_NOT_FOUND, username));
76
            throw new UsernameNotFoundException(String.format(USER_NOT_FOUND, username));
77
        });
78
        userEntity.setPermissions(getPermissionsFromDto(permissionDto));
79
        userEntity.setEmail(username);
80
        userRepository.save(userEntity);
81
    }
82

    
83
    @Override
84
    public void resetPassword(String username, String newPassword) {
85
        UserEntity userEntity = userRepository.findByEmail(username).orElseThrow(() ->{
86
            log.error(String.format(USER_NOT_FOUND, username));
87
            throw new UsernameNotFoundException(String.format(USER_NOT_FOUND, username));
88
        });
89
        userEntity.setPassword(bCryptPasswordEncoder.encode(newPassword));
90
        userRepository.save(userEntity);
91
    }
92

    
93
    //TODO maybe check if user is not deleting himself - or it might be ok
94
    @Override
95
    public void deleteUser(String username) {
96
        UserEntity userEntity = userRepository.findByEmail(username).orElseThrow(() ->{
97
            log.error(String.format(USER_NOT_FOUND, username));
98
            throw new UsernameNotFoundException(String.format(USER_NOT_FOUND, username));
99
        });
100
        userRepository.delete(userEntity);
101
    }
102

    
103
    @Override
104
    public List<UserDto> getAllUsers() {
105
        return userRepository.findAll().stream().map(this::convertEntityToDto).collect(Collectors.toList());
106
    }
107

    
108
    @Override
109
    public void changePassword(String oldPassword, PasswordDto passwordDto) {
110
        UserEntity loggedUser = getUserByName((String) SecurityContextHolder.getContext().getAuthentication().getPrincipal());
111
        if (!bCryptPasswordEncoder.matches(oldPassword, loggedUser.getPassword())) {
112
            throw new ApiRequestException("Old password does not match", HttpStatus.BAD_REQUEST);
113
        }
114
        loggedUser.setPassword(bCryptPasswordEncoder.encode(passwordDto.getPassword()));
115
        userRepository.save(loggedUser);
116
    }
117

    
118

    
119

    
120
    /**
121
     * Converts user DTO to user entity
122
     *
123
     * @param userDto    user DTO
124
     * @param userEntity user entity
125
     */
126
    private void convertDtoToEntity(UserDto userDto, UserEntity userEntity) {
127
        userEntity.setName(userDto.getName());
128
        userEntity.setEmail(userDto.getEmail());
129
        userEntity.setPermissions(getPermissionsFromDto(userDto.getPermissions()));
130
        userEntity.setPassword(bCryptPasswordEncoder.encode(userDto.getPasswords().getPassword()));
131
    }
132

    
133
    /**
134
     * Converts user entity to user DTO
135
     *
136
     * @param userEntity user entity
137
     * @return user DTO from user entity
138
     */
139
    private UserDto convertEntityToDto(UserEntity userEntity) {
140
        UserDto userDto = new UserDto();
141
        userDto.setName(userEntity.getName());
142
        userDto.setEmail(userEntity.getEmail());
143
        setPermissionsToDto(userDto, userEntity);
144
        return userDto;
145
    }
146

    
147
    /**
148
     * Sets permission to user DTO based on user entity
149
     *
150
     * @param userDto    user DTO
151
     * @param userEntity user entity
152
     */
153
    private void setPermissionsToDto(UserDto userDto, UserEntity userEntity) {
154
        byte userPermissions = userEntity.getPermissions();
155
        PermissionDto permissionDto = new PermissionDto();
156
        if ((userPermissions & Permission.READ.getBit()) == Permission.READ.getBit()) {
157
            permissionDto.setCanRead(true);
158
        }
159
        if ((userPermissions & Permission.WRITE.getBit()) == Permission.WRITE.getBit()) {
160
            permissionDto.setCanWrite(true);
161
        }
162
        if ((userPermissions & Permission.DELETE.getBit()) == Permission.DELETE.getBit()) {
163
            permissionDto.setCanDelete(true);
164
        }
165
        userDto.setPermissions(permissionDto);
166
    }
167

    
168
    /**
169
     * Returns permissions as byte from permission DTO
170
     *
171
     * @param permissionDto permission DTO
172
     * @return permissions as byte
173
     */
174
    private byte getPermissionsFromDto(PermissionDto permissionDto) {
175
        byte permissions = (byte) 0;
176
        if (permissionDto.isCanRead()) {
177
            permissions |= Permission.READ.getBit();
178
        }
179
        if (permissionDto.isCanWrite()) {
180
            permissions |= Permission.WRITE.getBit();
181
        }
182
        if (permissionDto.isCanDelete()) {
183
            permissions |= Permission.DELETE.getBit();
184
        }
185
        return permissions;
186
    }
187
}
(8-8/8)