Skip to content
Draft
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
130 changes: 130 additions & 0 deletions pre-api-stg.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2354,6 +2354,14 @@ definitions:
format: uuid
type: string
type: object
RecordingVisibility:
properties:
recordingId:
format: uuid
type: string
visibility:
type: string
type: object
RecordingsPerCaseReportDTO:
description: RecordingsPerCaseReportDTO
properties:
Expand Down Expand Up @@ -4458,6 +4466,102 @@ paths:
summary: Search all Recordings
tags:
- recording-controller
/recordings/visibility:
get:
operationId: recordingVisibility
parameters:
- description: Get a list of recordings that are visible/invisible by exception
enum:
- DEFAULT
- VISIBLE
- INVISIBLE
in: query
name: visible
required: true
type: string
x-example: VISIBLE
- description: The User Id of the User making the request
format: uuid
in: header
name: X-User-Id
required: false
type: string
x-example: 123e4567-e89b-12d3-a456-426614174000
produces:
- application/octet-stream
responses:
'200':
description: OK
schema:
items:
format: uuid
type: string
type: array
summary: Get recordings that are (in)visible by exception
tags:
- recording-controller
put:
consumes:
- multipart/form-data
operationId: updateRecordingsVisibility
parameters:
- description: The User Id of the User making the request
format: uuid
in: header
name: X-User-Id
required: false
type: string
x-example: 123e4567-e89b-12d3-a456-426614174000
- format: binary
in: formData
name: file
required: true
type: string
produces:
- application/octet-stream
responses:
'200':
description: OK
schema:
items:
$ref: '#/definitions/RecordingVisibility'
type: array
tags:
- recording-controller
/recordings/visibility/reset:
put:
consumes:
- application/json
operationId: recordingVisibility_1
parameters:
- description: The User Id of the User making the request
format: uuid
in: header
name: X-User-Id
required: false
type: string
x-example: 123e4567-e89b-12d3-a456-426614174000
- in: body
name: body
required: true
schema:
items:
format: uuid
type: string
type: array
produces:
- application/octet-stream
responses:
'200':
description: OK
schema:
items:
format: uuid
type: string
type: array
summary: Reset visibility of recordings to default
tags:
- recording-controller
'/recordings/{recordingId}':
delete:
operationId: deleteRecording
Expand Down Expand Up @@ -4555,6 +4659,32 @@ paths:
summary: Revert deletion of a recording
tags:
- recording-controller
'/recordings/{recordingId}/visibility':
get:
operationId: getRecordingVisibilityById
parameters:
- format: uuid
in: path
name: recordingId
required: true
type: string
- description: The User Id of the User making the request
format: uuid
in: header
name: X-User-Id
required: false
type: string
x-example: 123e4567-e89b-12d3-a456-426614174000
produces:
- application/octet-stream
responses:
'200':
description: OK
schema:
type: string
summary: Get a Recording Visibility by Id
tags:
- recording-controller
/reports-v2/capture-sessions-concurrent:
get:
operationId: reportConcurrentCaptureSessionsv2
Expand Down
2 changes: 1 addition & 1 deletion specs/pre-api.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import org.springframework.hateoas.EntityModel;
import org.springframework.hateoas.PagedModel;
import org.springframework.http.HttpEntity;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -23,15 +24,22 @@
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import uk.gov.hmcts.reform.preapi.controllers.base.PreApiController;
import uk.gov.hmcts.reform.preapi.controllers.params.SearchRecordings;
import uk.gov.hmcts.reform.preapi.dto.CreateRecordingDTO;
import uk.gov.hmcts.reform.preapi.dto.RecordingDTO;
import uk.gov.hmcts.reform.preapi.entities.RecordingVisibility;
import uk.gov.hmcts.reform.preapi.enums.RecordingVisibilityStatus;
import uk.gov.hmcts.reform.preapi.exception.BadRequestException;
import uk.gov.hmcts.reform.preapi.exception.PathPayloadMismatchException;
import uk.gov.hmcts.reform.preapi.exception.RequestedPageOutOfRangeException;
import uk.gov.hmcts.reform.preapi.exception.UnsupportedMediaTypeException;
import uk.gov.hmcts.reform.preapi.services.RecordingService;

import java.util.List;
import java.util.UUID;

@RestController
Expand All @@ -55,6 +63,53 @@ public ResponseEntity<RecordingDTO> getRecordingById(
return ResponseEntity.ok(recordingService.findById(recordingId));
}


@GetMapping("/{recordingId}/visibility")
@Operation(operationId = "getRecordingVisibilityById", summary = "Get a Recording Visibility by Id")
@PreAuthorize("hasRole('ROLE_SUPER_USER')")
public ResponseEntity<String> getRecordingVisibilityById(
@PathVariable UUID recordingId
) {
return ResponseEntity.ok(recordingService.getRecordingVisibility(recordingId).name());
}

@GetMapping("/visibility")
@PreAuthorize("hasRole('ROLE_SUPER_USER')")
@Parameter(
name = "visible",
description = "Get a list of recordings that are visible/invisible by exception",
schema = @Schema(implementation = RecordingVisibilityStatus.class),
example = "VISIBLE")
@Operation(operationId = "recordingVisibility",
summary = "Get recordings that are (in)visible by exception")
public ResponseEntity<List<UUID>> getVisibleRecordingsList(RecordingVisibilityStatus visible) {
return ResponseEntity.ok(recordingService.getVisibleRecordingsList(visible));
}

@PutMapping(value = "/visibility", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@PreAuthorize("hasRole('ROLE_SUPER_USER')")
public ResponseEntity<List<RecordingVisibility>>
updateRecordingsVisibility(@RequestParam("file") MultipartFile file) {
String fileType = file.getContentType();
if (fileType == null || !fileType.equals(CSV_FILE_TYPE)) {
throw new UnsupportedMediaTypeException("Unsupported media type: Only CSV files are supported");
}

if (file.isEmpty()) {
throw new BadRequestException("File must not be empty");
}

return ResponseEntity.ok(recordingService.updateVisibleRecordingsList(file));
}

@PutMapping("/visibility/reset")
@PreAuthorize("hasRole('ROLE_SUPER_USER')")
@Operation(operationId = "recordingVisibility",
summary = "Reset visibility of recordings to default")
public ResponseEntity<List<UUID>> getVisibleRecordingsList(@RequestBody List<UUID> recordingIds) {
return ResponseEntity.ok(recordingService.resetVisibleRecordingsList(recordingIds));
}

@GetMapping
@Operation(operationId = "getRecordings", summary = "Search all Recordings")
@Parameter(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
Expand All @@ -12,13 +14,15 @@
import jakarta.persistence.Transient;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.annotations.Type;
import org.hibernate.type.SqlTypes;
import uk.gov.hmcts.reform.preapi.entities.base.BaseEntity;
import uk.gov.hmcts.reform.preapi.entities.base.ISoftDeletable;
import uk.gov.hmcts.reform.preapi.entities.listeners.RecordingListener;
import uk.gov.hmcts.reform.preapi.enums.RecordingVisibilityStatus;

import java.sql.Timestamp;
import java.time.Duration;
Expand Down Expand Up @@ -83,6 +87,12 @@ public boolean isDeleted() {
return deletedAt != null;
}

@ColumnDefault("DEFAULT")
@Enumerated(EnumType.STRING)
@Column(name = "visibility", nullable = false, columnDefinition = "RECORDING_VISIBILITY")
@JdbcTypeCode(SqlTypes.NAMED_ENUM)
public RecordingVisibilityStatus visibility;

@Override
public Map<String, Object> getDetailsForAudit() {
Map<String, Object> details = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package uk.gov.hmcts.reform.preapi.entities;

import com.opencsv.bean.CsvBindByName;
import lombok.Getter;
import lombok.Setter;

import java.util.UUID;

@Getter
@Setter
public class RecordingVisibility {

@CsvBindByName(column = "recording_id")
public UUID recordingId;

@CsvBindByName(column = "visible")
public String visibility;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package uk.gov.hmcts.reform.preapi.enums;

public enum RecordingVisibilityStatus {
DEFAULT,
VISIBLE,
INVISIBLE
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import uk.gov.hmcts.reform.preapi.controllers.params.SearchRecordings;
import uk.gov.hmcts.reform.preapi.entities.CaptureSession;
import uk.gov.hmcts.reform.preapi.entities.Recording;
import uk.gov.hmcts.reform.preapi.enums.RecordingVisibilityStatus;

import java.util.Collection;
import java.util.List;
Expand All @@ -32,6 +33,8 @@ Optional<Recording> findByIdAndDeletedAtIsNull(
@Param("includeReencodedRecordings") boolean includeReencodedRecordings
);

List<Recording> getByVisibilityIs(RecordingVisibilityStatus visibility);

@Query(
"""
SELECT r FROM Recording r
Expand Down Expand Up @@ -107,6 +110,8 @@ Page<Recording> searchAllBy(
Pageable pageable
);

boolean existsByIdIsAndVisibilityIs(UUID recordingId, RecordingVisibilityStatus recordingVisibilityStatus);

boolean existsByIdAndDeletedAtIsNull(UUID id);

List<Recording> findAllByParentRecordingIsNotNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import uk.gov.hmcts.reform.preapi.entities.Recording;
import uk.gov.hmcts.reform.preapi.enums.CaseState;
import uk.gov.hmcts.reform.preapi.enums.RecordingOrigin;
import uk.gov.hmcts.reform.preapi.enums.RecordingVisibilityStatus;
import uk.gov.hmcts.reform.preapi.repositories.BookingRepository;
import uk.gov.hmcts.reform.preapi.repositories.CaptureSessionRepository;
import uk.gov.hmcts.reform.preapi.repositories.CaseRepository;
Expand Down Expand Up @@ -216,6 +217,7 @@ public boolean canViewVodafoneData(UserAuthentication authentication) {

public boolean canViewReencodedRecording(UserAuthentication authentication, Recording recording) {
return !hideReencodedRecordings
|| recordingRepository.existsByIdIsAndVisibilityIs(recording.getId(), RecordingVisibilityStatus.VISIBLE)
|| !recording.isReencode()
|| authentication.hasRole(ROLE_SUPER_USER);
}
Expand Down
Loading
Loading