com.osomapps.pt.token.TokenService   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 156
Duplicated Lines 8.97 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 15
eloc 139
dl 14
loc 156
rs 10
c 1
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A TokenService(InUserRepository,InUserLoginRepository,InUserLogoutRepository,InUserFacebookRepository,FacebookService) 0 12 1
A readOrCreateInUserFacebook(TokenRequestDTO) 0 24 2
C createOrReadNewToken(TokenRequestDTO,String) 0 92 9
A deleteToken(String,String) 14 14 3

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
package com.osomapps.pt.token;
2
3
import com.fasterxml.jackson.core.type.TypeReference;
4
import com.fasterxml.jackson.databind.ObjectMapper;
5
import com.osomapps.pt.ResourceNotFoundException;
6
import com.osomapps.pt.UnauthorizedException;
7
import com.osomapps.pt.user.UserGoalResponseDTO;
8
import com.osomapps.pt.user.UserLevel;
9
import java.io.IOException;
10
import java.time.LocalDateTime;
11
import java.util.Arrays;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.Optional;
15
import java.util.stream.Collectors;
16
import org.springframework.beans.factory.annotation.Autowired;
17
import org.springframework.data.util.Pair;
18
import org.springframework.stereotype.Service;
19
20
@Service
21
class TokenService {
22
    private final InUserRepository inUserRepository;
23
    private final InUserLoginRepository inUserLoginRepository;
24
    private final InUserLogoutRepository inUserLogoutRepository;
25
    private final InUserFacebookRepository inUserFacebookRepository;
26
    private final FacebookService facebookService;
27
28
    @Autowired
29
    TokenService(
30
            InUserRepository inUserRepository,
31
            InUserLoginRepository inUserLoginRepository,
32
            InUserLogoutRepository inUserLogoutRepository,
33
            InUserFacebookRepository inUserFacebookRepository,
34
            FacebookService facebookService) {
35
        this.inUserRepository = inUserRepository;
36
        this.inUserLoginRepository = inUserLoginRepository;
37
        this.inUserLogoutRepository = inUserLogoutRepository;
38
        this.inUserFacebookRepository = inUserFacebookRepository;
39
        this.facebookService = facebookService;
40
    }
41
42
    Pair<Boolean, InUserFacebook> readOrCreateInUserFacebook(TokenRequestDTO tokenRequest) {
43
        final InUserFacebook inUserFacebook;
44
        final boolean isNewLogin;
45
        final List<InUserFacebook> inUserFacebooks =
46
                inUserFacebookRepository.findByDeviceId(tokenRequest.getDevice_id());
47
        if (inUserFacebooks.isEmpty()) {
48
            inUserFacebook = new InUserFacebook();
49
            inUserFacebook.setToken(tokenRequest.getFacebook_token());
50
            inUserFacebook.setDeviceId(tokenRequest.getDevice_id());
51
            isNewLogin = true;
52
        } else {
53
            final InUserFacebook inUserFacebookOld =
54
                    inUserFacebooks.get(inUserFacebooks.size() - 1);
55
            final List<InUserLogout> inUserLogouts =
56
                    inUserLogoutRepository.findByToken(
57
                            inUserFacebookOld
58
                                    .getInUser()
59
                                    .getInUserLogins()
60
                                    .get(inUserFacebookOld.getInUser().getInUserLogins().size() - 1)
61
                                    .getToken());
62
            inUserFacebook = inUserFacebookOld;
63
            isNewLogin = !inUserLogouts.isEmpty();
64
        }
65
        return Pair.of(isNewLogin, inUserFacebook);
66
    }
67
68
    TokenResponseDTO createOrReadNewToken(TokenRequestDTO tokenRequest, String remoteAddr) {
69
        final InUser inUser;
70
        final Pair<Boolean, InUserFacebook> inUserFacebookData =
71
                readOrCreateInUserFacebook(tokenRequest);
72
        final boolean isNewLogin = inUserFacebookData.getFirst();
73
        InUserFacebook inUserFacebook = inUserFacebookData.getSecond();
74
        FacebookResponse facebookResponse =
75
                facebookService
76
                        .getProfileNameAndId(tokenRequest.getFacebook_token())
77
                        .orElseThrow(
78
                                () ->
79
                                        new ResourceNotFoundException(
80
                                                "Can't load data from facebook"));
81
        Optional<String> pictureUrl =
82
                facebookService.getProfilePictureUrl(tokenRequest.getFacebook_token());
83
        inUserFacebook.setUserId(facebookResponse.getId());
84
        if (inUserFacebook.getUser_name() == null) {
85
            inUserFacebook.setUser_name(facebookResponse.getName());
86
        }
87
        inUserFacebook.setPicture_url(pictureUrl.orElse(null));
88
        inUserFacebook.setBirthday(facebookResponse.getBirthday());
89
        final List<InUserFacebook> inUserFacebooksNew =
90
                inUserFacebookRepository.findByUserId(facebookResponse.getId());
91
        final InUserLogin inUserLogin;
92
        if (isNewLogin) {
93
            inUserLogin = new InUserLogin();
94
        } else {
95
            inUserLogin =
96
                    inUserFacebook
97
                            .getInUser()
98
                            .getInUserLogins()
99
                            .get(inUserFacebook.getInUser().getInUserLogins().size() - 1);
100
        }
101
        if (inUserFacebooksNew.isEmpty()) {
102
            inUser = new InUser();
103
            inUser.setInUserFacebooks(Arrays.asList(inUserFacebook));
104
            inUser.setInUserLogins(Arrays.asList(inUserLogin));
105
        } else {
106
            inUser = inUserFacebooksNew.get(inUserFacebooksNew.size() - 1).getInUser();
107
            inUser.getInUserFacebooks().add(inUserFacebook);
108
            inUser.getInUserLogins().add(inUserLogin);
109
        }
110
        inUser.setD_sex(facebookResponse.getGender());
111
        inUser.setAge(facebookResponse.getAge().floatValue());
112
        inUser.setBirthday(facebookResponse.getBirthday());
113
        inUser.setUpdated(LocalDateTime.now());
114
        final InUser savedInUser = inUserRepository.save(inUser);
115
        inUserLogin.setInUser(savedInUser);
116
        inUserLogin.setIp_address(remoteAddr);
117
        inUserLoginRepository.saveAndFlush(inUserLogin);
118
        inUserFacebook.setInUser(inUser);
119
        inUserFacebookRepository.save(inUserFacebook);
120
        final TokenResponseDTO tokenResponseDTO = new TokenResponseDTO();
121
        tokenResponseDTO.setToken(inUserLogin.getToken());
122
        final UserResponseDTO user = new UserResponseDTO();
123
        user.setId(inUserFacebook.getInUser().getId());
124
        user.setName(inUserFacebook.getUser_name());
125
        user.setAvatar(inUserFacebook.getPicture_url());
126
        user.setGender(facebookResponse.getGender());
127
        user.setAge(facebookResponse.getAge());
128
        user.setBirthday(inUser.getBirthday());
129
        user.setAvatar_dataurl(inUser.getAvatar_dataurl());
130
        if (inUser.getD_level() != null) {
131
            user.setLevel(UserLevel.of(Integer.parseInt(inUser.getD_level())));
132
        }
133
        user.setGoals(
134
                inUser.getInUserGoals().stream()
135
                        .map(
136
                                inUserGoal -> {
137
                                    Map<String, Integer> map = null;
138
                                    try {
139
                                        map =
140
                                                inUserGoal.getGoal_value() == null
141
                                                        ? null
142
                                                        : new ObjectMapper()
143
                                                                .readValue(
144
                                                                        inUserGoal.getGoal_value(),
145
                                                                        new TypeReference<
146
                                                                                Map<
147
                                                                                        String,
148
                                                                                        Integer>>() {});
149
                                    } catch (IOException ex) {
0 ignored issues
show
Bug introduced by
Consider removing the empty block or filling it with code. You can also add a comment to explain the empty block.
Loading history...
150
                                    }
151
                                    return new UserGoalResponseDTO()
152
                                            .setId(inUserGoal.getGoalId())
153
                                            .setValues(map);
154
                                })
155
                        .collect(Collectors.toList()));
156
        user.setHeight(inUser.getHeight() == null ? null : inUser.getHeight().longValue());
157
        user.setWeight(inUser.getWeight() == null ? null : inUser.getWeight().longValue());
158
        tokenResponseDTO.setUser(user);
159
        return tokenResponseDTO;
160
    }
161
162 View Code Duplication
    void deleteToken(String token, String remoteAddr) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
163
        final List<InUserLogin> inUserLogins = inUserLoginRepository.findByToken(token);
164
        if (!inUserLogins.isEmpty()) {
165
            final List<InUserLogout> inUserLogouts = inUserLogoutRepository.findByToken(token);
166
            if (!inUserLogouts.isEmpty()) {
167
                throw new UnauthorizedException("Invalid token");
168
            }
169
            InUserLogout inUserLogout = new InUserLogout();
170
            inUserLogout.setToken(token);
171
            inUserLogout.setInUser(inUserLogins.get(inUserLogins.size() - 1).getInUser());
172
            inUserLogout.setIp_address(remoteAddr);
173
            inUserLogoutRepository.saveAndFlush(inUserLogout);
174
        } else {
175
            throw new UnauthorizedException("Token not found");
176
        }
177
    }
178
}
179