Skip to content

Commit

Permalink
Add patch endpoint to assessment api
Browse files Browse the repository at this point in the history
  • Loading branch information
PhilDigitalJustice committed Apr 4, 2024
1 parent ec7c688 commit 49c4324
Show file tree
Hide file tree
Showing 11 changed files with 391 additions and 19 deletions.
74 changes: 62 additions & 12 deletions assessment-api/open-api-specification.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
openapi: '3.0.0'
info:
title: 'laa-ccms-assessment-api'
title: 'laa-ccms-caab-assessment-api'
version: '1.0.0'
paths:
/assessments:
get:
tags:
- 'assessment'
- assessments
summary: 'get assessments'
operationId: 'getAssessments'
parameters:
Expand Down Expand Up @@ -44,7 +44,7 @@ paths:
/assessments/{assessment-id}:
get:
tags:
- 'assessment'
- assessments
summary: 'get assessment by id '
operationId: 'getAssessment'
parameters:
Expand All @@ -70,6 +70,41 @@ paths:
description: 'Not found'
'500':
description: 'Internal server error'
patch:
tags:
- assessments
summary: 'update assessment'
operationId: 'updateAssessment'
requestBody:
description: Create a application
content:
application/json:
schema:
$ref: '#/components/schemas/baseAssessmentDetail'
parameters:
- name: 'assessment-id'
in: 'path'
required: true
schema:
type: 'integer'
format: 'int64'
example: '1234567890'
- $ref: '#/components/parameters/requiredUserLoginId'
responses:
'200':
description: 'Successful operation'
content:
application/json:
schema:
$ref: "#/components/schemas/assessmentDetail"
'400':
description: 'Bad request'
'401':
description: 'Unauthorized'
'404':
description: 'Not found'
'500':
description: 'Internal server error'

components:
parameters:
Expand All @@ -89,6 +124,14 @@ components:
- 'meritsAssessment_PREPOP'
example: 'meansAssessment'

requiredUserLoginId:
name: 'Caab-User-Login-Id'
in: header
required: true
schema:
type: 'string'
example: '[email protected]'

schemas:
assessmentDetails:
type: 'object'
Expand All @@ -99,10 +142,24 @@ components:
items:
$ref: "#/components/schemas/assessmentDetail"
assessmentDetail:
allOf:
- $ref: "#/components/schemas/baseAssessmentDetail"
- type: 'object'
properties:
id:
type: 'string'
entity_types:
type: array
default: [ ]
items:
$ref: '#/components/schemas/assessmentEntityTypeDetail'
audit_detail:
$ref: '#/components/schemas/auditDetail'
baseAssessmentDetail:
type: 'object'
discriminator:
propertyName: baseAssessmentDetail
properties:
id:
type: 'string'
provider_id:
type: 'string'
case_reference_number:
Expand All @@ -111,13 +168,6 @@ components:
type: 'string'
status:
type: 'string'
entity_types:
type: array
default: [ ]
items:
$ref: '#/components/schemas/assessmentEntityTypeDetail'
audit_detail:
$ref: '#/components/schemas/auditDetail'
auditDetail:
type: 'object'
properties:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package uk.gov.laa.ccms.caab.assessment.advice;

import static uk.gov.laa.ccms.caab.assessment.audit.AuditorAwareImpl.currentUserHolder;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestHeader;

/**
* Controller advice class responsible for setting the current user holder if available.
*/
@ControllerAdvice
public class AuditAdvice {

/**
* Sets the current user holder if available from the request header.
*
* @param caabUserLoginId the caab user login id
*/
@ModelAttribute
public void setCurrentUserHolderIfAvailable(
@RequestHeader(value = "Caab-User-Login-Id", required = false) String caabUserLoginId) {
if (caabUserLoginId != null) {
currentUserHolder.set(caabUserLoginId);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package uk.gov.laa.ccms.caab.assessment.audit;


import java.util.Optional;
import org.springframework.data.domain.AuditorAware;

/**
* Auditor provider implementation for the application. This class is responsible for storing the
* current user in a thread local variable, and returning it when requested.
*/
public class AuditorAwareImpl implements AuditorAware<String> {

public static final ThreadLocal<String> currentUserHolder = new ThreadLocal<String>();

@Override
public Optional<String> getCurrentAuditor() {
return Optional.of(currentUserHolder.get());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package uk.gov.laa.ccms.caab.assessment.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.AuditorAware;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import uk.gov.laa.ccms.caab.assessment.audit.AuditorAwareImpl;

/**
* Configuration for the application, and the auditor provider.
*/
@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorProvider")
public class ApplicationConfig {

@Bean("auditorProvider")
public AuditorAware<String> auditorProvider() {
return new AuditorAwareImpl();
}

}
Original file line number Diff line number Diff line change
@@ -1,29 +1,46 @@
package uk.gov.laa.ccms.caab.assessment.controller;

import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import uk.gov.laa.ccms.caab.assessment.api.AssessmentApi;
import org.springframework.web.bind.annotation.RestController;
import uk.gov.laa.ccms.caab.assessment.api.AssessmentsApi;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetail;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetails;
import uk.gov.laa.ccms.caab.assessment.model.BaseAssessmentDetail;
import uk.gov.laa.ccms.caab.assessment.service.AssessmentService;

/**
* Controller handling assessment requests.
*/
@Controller
@RestController
@RequiredArgsConstructor
public class AssessmentController implements AssessmentApi {
public class AssessmentController implements AssessmentsApi {

private final AssessmentService assessmentService;

/**
* Retrieves a single assessment by its ID.
*
* @param assessmentId The ID of the assessment to retrieve.
* @return ResponseEntity containing the requested AssessmentDetail.
*/
@Override
public ResponseEntity<AssessmentDetail> getAssessment(
final Long assessmentId) {

return ResponseEntity.ok(assessmentService.getAssessment(assessmentId));
}

/**
* Retrieves a list of assessments matching the given criteria.
*
* @param name The name to search for.
* @param providerId The provider ID to search for.
* @param caseReferenceNumber The case reference number to search for.
* @param status The status to search for.
* @return ResponseEntity containing the list of matching AssessmentDetails.
*/
@Override
public ResponseEntity<AssessmentDetails> getAssessments(
final String name,
Expand All @@ -39,4 +56,22 @@ public ResponseEntity<AssessmentDetails> getAssessments(

return ResponseEntity.ok(assessmentService.getAssessments(criteria));
}

/**
* Updates an assessment with the provided details.
*
* @param assessmentId The ID of the assessment to update.
* @param caabUserLoginId The CAAB user login ID performing the update.
* @param baseAssessmentDetail The details to update the assessment with.
* @return ResponseEntity with the status of the update operation.
*/
@Override
public ResponseEntity<AssessmentDetail> updateAssessment(
final Long assessmentId,
final String caabUserLoginId,
final BaseAssessmentDetail baseAssessmentDetail) {

assessmentService.updateAssessment(assessmentId, baseAssessmentDetail);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package uk.gov.laa.ccms.caab.assessment.mapper;

import java.util.List;
import org.mapstruct.BeanMapping;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.InheritInverseConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
import uk.gov.laa.ccms.caab.assessment.entity.OpaAttribute;
import uk.gov.laa.ccms.caab.assessment.entity.OpaEntity;
import uk.gov.laa.ccms.caab.assessment.entity.OpaListEntity;
Expand All @@ -13,6 +17,7 @@
import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetails;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentEntityDetail;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentEntityTypeDetail;
import uk.gov.laa.ccms.caab.assessment.model.BaseAssessmentDetail;

/**
* Mapper for mapping between assessment entities and models.
Expand All @@ -28,7 +33,7 @@ public interface AssessmentMapper {
@Mapping(target = "opaListEntities", ignore = true)
OpaSession toOpaSession(AssessmentDetail assessmentDetail);

@InheritInverseConfiguration
@InheritInverseConfiguration(name = "toOpaSession")
@Mapping(target = "auditDetail", source = "auditTrail")
@Mapping(target = "entityTypes", source = "opaListEntities")
AssessmentDetail toAssessmentDetail(OpaSession opaSession);
Expand All @@ -45,6 +50,13 @@ public interface AssessmentMapper {
@Mapping(target = "type", source = "attributeType")
AssessmentAttributeDetail toAssessmentAttributeDetail(OpaAttribute opaAttribute);

@InheritConfiguration(name = "toOpaSession")
@Mapping(target = "opaListEntities", ignore = true)
@BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void mapIntoOpaSession(
@MappingTarget OpaSession opaSession,
AssessmentDetail assessmentDetail);

/**
* Maps a list of {@link OpaSession} entities to an {@link AssessmentDetails} model.
*
Expand All @@ -62,4 +74,6 @@ default AssessmentDetails toAssessmentDetails(List<OpaSession> opaSessions) {
}




}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package uk.gov.laa.ccms.caab.assessment.service;

import jakarta.transaction.Transactional;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Example;
Expand All @@ -10,6 +11,7 @@
import uk.gov.laa.ccms.caab.assessment.mapper.AssessmentMapper;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetail;
import uk.gov.laa.ccms.caab.assessment.model.AssessmentDetails;
import uk.gov.laa.ccms.caab.assessment.model.BaseAssessmentDetail;
import uk.gov.laa.ccms.caab.assessment.repository.OpaSessionRepository;

/**
Expand Down Expand Up @@ -51,6 +53,27 @@ public AssessmentDetail getAssessment(Long assessmentId) {
HttpStatus.NOT_FOUND));
}

/**
* Updates an assessment's details in the database.
*
* @param assessmentId The ID of the assessment to update.
* @param baseAssessmentDetail The new details to be applied to the assessment.
* @throws ApplicationException if the assessment with the specified ID
* does not exist.
*/
@Transactional
public void updateAssessment(
final Long assessmentId,
final BaseAssessmentDetail baseAssessmentDetail) {
OpaSession opaSession = opaSessionRepository.findById(assessmentId)
.orElseThrow(() -> new ApplicationException(
String.format("Assessment with id %s not found", assessmentId),
HttpStatus.NOT_FOUND));

assessmentMapper.mapIntoOpaSession(opaSession, (AssessmentDetail) baseAssessmentDetail);
opaSessionRepository.save(opaSession);
}



}
Loading

0 comments on commit 49c4324

Please sign in to comment.