Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add patch endpoint to assessment api #3

Merged
merged 1 commit into from
Apr 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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: update an assessment
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:
porritta marked this conversation as resolved.
Show resolved Hide resolved
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
Loading