Skip to content

Commit 667064d

Browse files
MDybekWMS_BOT
authored andcommitted
Fixed jwt dependency update + added global exception handling for missing active programme(#10)
* Fixed jwt dependency update * Add global exception handling for missing active programme GitOrigin-RevId: f28b99c3bdecd9c7528b817713564ce072a6c516
1 parent 9cff2af commit 667064d

10 files changed

Lines changed: 72 additions & 20 deletions

File tree

.env-sample

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
SERVICE_JWT_SECRET_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
22

3-
SERVICE_DB_URL=jdbc:postgresql://localhost:5432/student-stats
3+
SERVICE_DB_URL=jdbc:postgresql://postgresdb:5432/student-stats
44
SERVICE_DB_LOGIN=postgres
55
SERVICE_DB_PASSWORD=postgres
66
SERVICE_DB_NAME=student-stats

service/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<usos4j.version>1.1.6</usos4j.version>
1919
<springdoc.openapi.starter.version>2.8.6</springdoc.openapi.starter.version>
2020
<jwt.version>0.12.6</jwt.version>
21-
<jwt-api.version>0.11.5</jwt-api.version>
21+
<jwt-api.version>0.12.6</jwt-api.version>
2222
<sentry.starter.version>8.5.0</sentry.starter.version>
2323
<opencsv.version>5.10</opencsv.version>
2424
<apache.commons.version>1.14.0</apache.commons.version>

service/src/main/java/pl/wmsdev/auth/service/UsosTokenServiceImpl.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ public RequestTokenResponse getRequestToken(String universityId, String callback
2929

3030
@Override
3131
public UsosAccessToken getAccessToken(UsosRequestToken requestToken, String verifier, String universityId) {
32-
var usos = usosFactory.createUsos(universityId);
33-
34-
return usos.getAccessToken(requestToken, verifier);
32+
return usosFactory.createUsos(universityId).getAccessToken(requestToken, verifier);
3533
}
3634
}

service/src/main/java/pl/wmsdev/data/service/programme/ProgrammeDetailsServiceImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@
66
import pl.wmsdev.data.dto.ProgrammeDetails;
77
import pl.wmsdev.usos4j.client.UsosUserAPI;
88
import pl.wmsdev.usos4j.model.progs.UsosProgramme;
9+
import pl.wmsdev.usos4j.model.progs.UsosStudentProgramme;
910
import pl.wmsdev.utils.converter.ProgrammeDetailsConverter;
11+
import pl.wmsdev.utils.exceptions.NotFoundException;
1012

13+
import java.util.List;
1114
import java.util.concurrent.CompletableFuture;
1215

1316
@Service
@@ -20,8 +23,13 @@ public class ProgrammeDetailsServiceImpl implements ProgrammeDetailsService {
2023
@Async
2124
@Override
2225
public CompletableFuture<ProgrammeDetails> getProgrammeDetails() {
23-
UsosProgramme programme = userApi.progs().student().get(0).programme(); // Every student has at least 1 programme
26+
List<UsosStudentProgramme> programmes = userApi.progs().student();
2427

28+
if (programmes.isEmpty()) {
29+
throw new NotFoundException("Student has no active study programme.");
30+
}
31+
32+
UsosProgramme programme = programmes.get(0).programme();
2533
return CompletableFuture.completedFuture(programmeDetailsConverter.toProgrammeDetails(programme));
2634
}
2735
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package pl.wmsdev.handlers;
2+
3+
import lombok.extern.slf4j.Slf4j;
4+
import org.springframework.http.HttpStatus;
5+
import org.springframework.http.MediaType;
6+
import org.springframework.http.ResponseEntity;
7+
import org.springframework.web.bind.annotation.ExceptionHandler;
8+
import org.springframework.web.bind.annotation.ControllerAdvice;
9+
import pl.wmsdev.utils.exceptions.NotFoundException;
10+
import pl.wmsdev.utils.dtos.ProblemDetailsDTO;
11+
12+
@ControllerAdvice
13+
@Slf4j
14+
public class GlobalExceptionHandler {
15+
16+
@ExceptionHandler(NotFoundException.class)
17+
public ResponseEntity<ProblemDetailsDTO> handleNoActiveProgrammeException(NotFoundException exception) {
18+
return handleException(
19+
exception,
20+
HttpStatus.NOT_FOUND,
21+
new ProblemDetailsDTO(exception.getMessage()));
22+
}
23+
24+
private <T extends Exception> ResponseEntity<ProblemDetailsDTO> handleException(T exception, HttpStatus httpStatus, ProblemDetailsDTO problemDetails) {
25+
logException(exception, problemDetails);
26+
27+
return ResponseEntity
28+
.status(httpStatus)
29+
.contentType(MediaType.APPLICATION_PROBLEM_JSON)
30+
.body(problemDetails);
31+
}
32+
33+
private <T extends Exception> void logException(T exception, ProblemDetailsDTO problemDetails) {
34+
log.error(problemDetails.message(), exception);
35+
}
36+
}
37+

service/src/main/java/pl/wmsdev/security/JwtService.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import io.jsonwebtoken.Claims;
44
import io.jsonwebtoken.Jwts;
5-
import io.jsonwebtoken.SignatureAlgorithm;
65
import io.jsonwebtoken.io.Decoders;
76
import io.jsonwebtoken.security.Keys;
87
import org.springframework.beans.factory.annotation.Value;
@@ -11,7 +10,7 @@
1110
import org.springframework.stereotype.Service;
1211
import pl.wmsdev.usos4j.model.auth.UsosAccessToken;
1312

14-
import java.security.Key;
13+
import javax.crypto.SecretKey;
1514
import java.util.Date;
1615
import java.util.Map;
1716
import java.util.function.Function;
@@ -39,11 +38,11 @@ public String generateToken(String accessToken, String accessTokenSecret, String
3938

4039
return Jwts
4140
.builder()
42-
.setClaims(claims)
43-
.setSubject(userDetails.getUsername())
44-
.setIssuedAt(new Date(System.currentTimeMillis()))
45-
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 120))
46-
.signWith(getSignInKey(), SignatureAlgorithm.HS256)
41+
.claims(claims)
42+
.subject(userDetails.getUsername())
43+
.issuedAt(new Date(System.currentTimeMillis()))
44+
.expiration(new Date(System.currentTimeMillis() + 1000 * 60 * 120))
45+
.signWith(getSignInKey(), Jwts.SIG.HS256)
4746
.compact();
4847
}
4948

@@ -62,14 +61,14 @@ private Date extractExpiration(JwtToken token) {
6261

6362
private Claims extractAllClaims(JwtToken token) {
6463
return Jwts
65-
.parserBuilder()
66-
.setSigningKey(getSignInKey())
64+
.parser()
65+
.verifyWith(getSignInKey())
6766
.build()
68-
.parseClaimsJws(token.jwt())
69-
.getBody();
67+
.parseSignedClaims(token.jwt())
68+
.getPayload();
7069
}
7170

72-
private Key getSignInKey() {
71+
private SecretKey getSignInKey() {
7372
byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);
7473
return Keys.hmacShaKeyFor(keyBytes);
7574
}

service/src/main/java/pl/wmsdev/usos/model/Course.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package pl.wmsdev.usos.model;
22

3-
43
import lombok.Builder;
54
import lombok.Data;
65
import lombok.Getter;

service/src/main/java/pl/wmsdev/usos/model/PersonalData.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,4 @@ public class PersonalData {
2323
private String usosProfileUrl;
2424
private String photoUrl;
2525
private List<Studies> studies;
26-
2726
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package pl.wmsdev.utils.dtos;
2+
3+
public record ProblemDetailsDTO(String message) {
4+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package pl.wmsdev.utils.exceptions;
2+
3+
public class NotFoundException extends RuntimeException {
4+
public NotFoundException(String message) {
5+
super(message);
6+
}
7+
}
8+

0 commit comments

Comments
 (0)