Skip to content

Commit 334be48

Browse files
authored
Dev To Main (#209)
1 parent cc99b21 commit 334be48

File tree

9 files changed

+437
-35
lines changed

9 files changed

+437
-35
lines changed

skill-tree/src/main/java/com/RDS/skilltree/apis/EndorsementsApi.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ public class EndorsementsApi {
2222

2323
@PatchMapping("/{id}")
2424
public ResponseEntity<EndorsementViewModel> update(
25-
@PathVariable Integer id, @Valid @RequestBody UpdateEndorsementViewModel body) {
26-
return new ResponseEntity<>(endorsementService.update(id, body), HttpStatus.OK);
25+
@PathVariable Integer id,
26+
@Valid @RequestBody UpdateEndorsementViewModel body,
27+
@RequestParam(name = "dev", required = false, defaultValue = "false") boolean isDev) {
28+
return new ResponseEntity<>(endorsementService.update(id, body, isDev), HttpStatus.OK);
2729
}
2830
}

skill-tree/src/main/java/com/RDS/skilltree/exceptions/GlobalExceptionHandler.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.RDS.skilltree.exceptions;
22

3+
import com.RDS.skilltree.utils.Constants.ExceptionMessages;
34
import com.RDS.skilltree.utils.GenericResponse;
45
import jakarta.validation.ConstraintViolationException;
56
import java.util.List;
@@ -27,10 +28,7 @@ public ResponseEntity<GenericResponse<Object>> handleNoEntityException(NoEntityE
2728
@ExceptionHandler({AuthenticationException.class, InsufficientAuthenticationException.class})
2829
public ResponseEntity<GenericResponse<Object>> handleInvalidBearerTokenException(Exception ex) {
2930
return ResponseEntity.status(HttpStatus.UNAUTHORIZED)
30-
.body(
31-
new GenericResponse<>(
32-
null,
33-
"The access token provided is expired, revoked, malformed, or invalid for other reasons."));
31+
.body(new GenericResponse<>(ExceptionMessages.INVALID_ACCESS_TOKEN));
3432
}
3533

3634
@ExceptionHandler({AccessDeniedException.class})
@@ -142,4 +140,11 @@ public ResponseEntity<?> handleEndorsementAlreadyExistsException(
142140
return new ResponseEntity<>(
143141
new GenericResponse<>(ex.getMessage()), HttpStatus.METHOD_NOT_ALLOWED);
144142
}
143+
144+
@ExceptionHandler(IllegalStateException.class)
145+
public ResponseEntity<?> handleIllegalStateException(IllegalStateException ex) {
146+
log.error("IllegalStateException - Error : {}", ex.getMessage());
147+
return new ResponseEntity<>(
148+
new GenericResponse<>(ex.getMessage()), HttpStatus.METHOD_NOT_ALLOWED);
149+
}
145150
}

skill-tree/src/main/java/com/RDS/skilltree/services/EndorsementService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ public interface EndorsementService {
1010

1111
EndorsementViewModel create(CreateEndorsementViewModel endorsement);
1212

13-
EndorsementViewModel update(Integer endorsementId, UpdateEndorsementViewModel endorsement);
13+
EndorsementViewModel update(
14+
Integer endorsementId, UpdateEndorsementViewModel endorsement, boolean isDev);
1415
}

skill-tree/src/main/java/com/RDS/skilltree/services/EndorsementServiceImplementation.java

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.RDS.skilltree.dtos.RdsGetUserDetailsResDto;
44
import com.RDS.skilltree.exceptions.EndorsementAlreadyExistsException;
55
import com.RDS.skilltree.exceptions.EndorsementNotFoundException;
6+
import com.RDS.skilltree.exceptions.ForbiddenException;
67
import com.RDS.skilltree.exceptions.SelfEndorsementNotAllowedException;
78
import com.RDS.skilltree.exceptions.SkillNotFoundException;
89
import com.RDS.skilltree.models.Endorsement;
@@ -130,30 +131,39 @@ public EndorsementViewModel create(CreateEndorsementViewModel endorsementViewMod
130131
}
131132

132133
@Override
133-
public EndorsementViewModel update(Integer endorsementId, UpdateEndorsementViewModel body) {
134-
Optional<Endorsement> exitingEndorsement = endorsementRepository.findById(endorsementId);
135-
136-
if (exitingEndorsement.isEmpty()) {
137-
log.info(String.format("Endorsement with id: %s not found", endorsementId));
138-
throw new EndorsementNotFoundException(ExceptionMessages.ENDORSEMENT_NOT_FOUND);
134+
public EndorsementViewModel update(
135+
Integer endorsementId, UpdateEndorsementViewModel body, boolean isDev) {
136+
if (isDev) {
137+
Optional<Endorsement> existingEndorsement = endorsementRepository.findById(endorsementId);
138+
139+
if (existingEndorsement.isEmpty()) {
140+
log.info("Endorsement with id: {} not found", endorsementId);
141+
throw new EndorsementNotFoundException(ExceptionMessages.ENDORSEMENT_NOT_FOUND);
142+
}
143+
144+
Endorsement endorsement = existingEndorsement.get();
145+
146+
JwtUser jwtDetails =
147+
(JwtUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
148+
String userId = jwtDetails.getRdsUserId();
149+
150+
if (endorsement.getEndorserId().equals(userId)) {
151+
RdsGetUserDetailsResDto endorseDetails =
152+
rdsService.getUserDetails(endorsement.getEndorseId());
153+
RdsGetUserDetailsResDto endorserDetails = rdsService.getUserDetails(userId);
154+
155+
endorsement.setMessage(body.getMessage());
156+
Endorsement savedEndorsementDetails = endorsementRepository.save(endorsement);
157+
158+
return EndorsementViewModel.toViewModel(
159+
savedEndorsementDetails,
160+
UserViewModel.toViewModel(endorseDetails.getUser()),
161+
UserViewModel.toViewModel(endorserDetails.getUser()));
162+
} else {
163+
log.warn("User: {} is not authorized to update endorsement: {}", userId, endorsementId);
164+
throw new ForbiddenException(ExceptionMessages.UNAUTHORIZED_ENDORSEMENT_UPDATE);
165+
}
139166
}
140-
141-
Endorsement endorsement = exitingEndorsement.get();
142-
String updatedMessage = body.getMessage();
143-
144-
if (updatedMessage != null) {
145-
endorsement.setMessage(updatedMessage);
146-
}
147-
148-
Endorsement savedEndorsementDetails = endorsementRepository.save(endorsement);
149-
RdsGetUserDetailsResDto endorseDetails =
150-
rdsService.getUserDetails(savedEndorsementDetails.getEndorseId());
151-
RdsGetUserDetailsResDto endorserDetails =
152-
rdsService.getUserDetails(savedEndorsementDetails.getEndorserId());
153-
154-
return EndorsementViewModel.toViewModel(
155-
savedEndorsementDetails,
156-
UserViewModel.toViewModel(endorseDetails.getUser()),
157-
UserViewModel.toViewModel(endorserDetails.getUser()));
167+
throw new IllegalStateException(ExceptionMessages.UPDATE_DISABLED_IN_NON_DEV_MODE);
158168
}
159169
}

skill-tree/src/main/java/com/RDS/skilltree/services/external/RdsServiceImplementation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.RDS.skilltree.dtos.RdsGetUserDetailsResDto;
44
import com.RDS.skilltree.exceptions.UserNotFoundException;
5+
import com.RDS.skilltree.utils.Constants.ExceptionMessages;
56
import lombok.RequiredArgsConstructor;
67
import org.slf4j.Logger;
78
import org.slf4j.LoggerFactory;
@@ -26,7 +27,7 @@ public RdsGetUserDetailsResDto getUserDetails(String id) {
2627
return restTemplate.getForObject(url, RdsGetUserDetailsResDto.class);
2728
} catch (RestClientException error) {
2829
log.error("Error calling url {}, error: {}", url, error.getMessage());
29-
throw new UserNotFoundException("Error getting user details");
30+
throw new UserNotFoundException(ExceptionMessages.USER_NOT_FOUND);
3031
}
3132
}
3233
}

skill-tree/src/main/java/com/RDS/skilltree/utils/Constants.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,14 @@ public static final class ExceptionMessages {
88
public static final String SKILL_NOT_FOUND = "Skill does not exist";
99
public static final String ENDORSEMENT_ALREADY_EXISTS = "Endorsement already exists";
1010
public static final String ENDORSEMENT_NOT_FOUND = "Endorsement not found";
11+
public static final String ENDORSEMENT_MESSAGE_EMPTY = "Endorsement message cannot be empty";
12+
public static final String USER_NOT_FOUND = "Error getting user details";
13+
public static final String UNAUTHORIZED_ENDORSEMENT_UPDATE =
14+
"Not authorized to update this endorsement";
15+
public static final String INVALID_ACCESS_TOKEN =
16+
"The access token provided is expired, revoked, malformed, or invalid for other reasons.";
17+
public static final String ACCESS_DENIED = "Access Denied";
18+
public static final String UPDATE_DISABLED_IN_NON_DEV_MODE =
19+
"Update is not allowed outside of development mode";
1120
}
1221
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.RDS.skilltree.viewmodels;
22

3-
import jakarta.validation.constraints.NotNull;
3+
import com.RDS.skilltree.utils.Constants.ExceptionMessages;
4+
import jakarta.validation.constraints.NotBlank;
45
import lombok.Getter;
56
import lombok.Setter;
67

78
@Getter
89
@Setter
910
public class UpdateEndorsementViewModel {
10-
@NotNull(message = "Message cannot be empty")
11+
@NotBlank(message = ExceptionMessages.ENDORSEMENT_MESSAGE_EMPTY)
1112
private String message;
1213
}

skill-tree/src/main/resources/application-test.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
cookieName=rds-session-v2-development
1+
cookieName=rds-session-v2
22
test.db.mysql-image=mysql:8.1.0
33
spring.flyway.enabled=true
44
spring.flyway.locations=classpath:db/migrations

0 commit comments

Comments
 (0)