Skip to content

Commit

Permalink
creating an end point for migrating fqm
Browse files Browse the repository at this point in the history
  • Loading branch information
kjain110 committed Aug 15, 2024
1 parent ada6a2a commit c8890da
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 5 deletions.
31 changes: 31 additions & 0 deletions src/main/java/org/folio/fqm/resource/MigrationController.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,49 @@
package org.folio.fqm.resource;

import lombok.RequiredArgsConstructor;
import org.folio.fqm.domain.dto.FqmMigrateRequest;
import org.folio.fqm.domain.dto.FqmMigrateResponse;
import org.folio.fqm.domain.dto.FqmMigrateResponseWarningsInner;
import org.folio.fqm.migration.MigratableQueryInformation;
import org.folio.fqm.service.MigrationService;
import org.folio.spring.i18n.service.TranslationService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequiredArgsConstructor
public class MigrationController implements FqmVersionApi {
private final MigrationService migrationService;

private final TranslationService translationService;

@Override
public ResponseEntity<String> getFqmVersion() {
return new ResponseEntity<>(migrationService.getLatestVersion(), HttpStatus.OK);
}

@Override
public ResponseEntity<FqmMigrateResponse> fqmMigrate(FqmMigrateRequest fqmMigrateRequest) {
MigratableQueryInformation migratableQueryInformation = new MigratableQueryInformation(
fqmMigrateRequest.getEntityTypeId(),
fqmMigrateRequest.getFqlQuery(),
fqmMigrateRequest.getFields()
);

migrationService.migrate(migratableQueryInformation);

FqmMigrateResponse fqmMigrateResponse = new FqmMigrateResponse()
.entityTypeId(migratableQueryInformation.entityTypeId())
.fqlQuery(migratableQueryInformation.fqlQuery())
.fields(migratableQueryInformation.fields())
.warnings(migratableQueryInformation.warnings().stream()
.map(warning -> new FqmMigrateResponseWarningsInner()
.type(warning.getType().toString())
.description(warning.getDescription(translationService))
)
.toList());
return new ResponseEntity<>(fqmMigrateResponse, HttpStatus.OK);
}
}
29 changes: 28 additions & 1 deletion src/main/resources/swagger.api/mod-fqm-manager.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,30 @@ paths:
$ref: '#/components/responses/badRequestResponse'
'500':
$ref: '#/components/responses/internalServerErrorResponse'
/fqm/migrate:
post:
summary: fqm migrate request
operationId: fqmMigrate
tags:
- fqmVersion
requestBody:
description: 'Request for FQM version submitted successfully'
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/fqmMigrateRequest'
responses:
'201':
description: 'FQM version updated successfully'
content:
application/json:
schema:
$ref: '#/components/schemas/fqmMigrateResponse'
'400':
$ref: '#/components/responses/badRequestResponse'
'500':
$ref: '#/components/responses/internalServerErrorResponse'

components:
parameters:
Expand Down Expand Up @@ -137,6 +161,10 @@ components:
type: array
items:
type: string
fqmMigrateRequest:
$ref: schemas/FqmMigrateRequest.json
fqmMigrateResponse:
$ref: schemas/FqmMigrateResponse.json

responses:
badRequestResponse:
Expand All @@ -159,4 +187,3 @@ components:
code: unexpected.error
schema:
$ref: "#/components/schemas/errorResponse"

27 changes: 27 additions & 0 deletions src/main/resources/swagger.api/schemas/FqmMigrateRequest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Entity Upgrade Request",
"description": "Schema for a request to upgrade an entity payload, including an entity type ID, FQL query, and list of fields.",
"type": "object",
"properties": {
"entityTypeId": {
"description": "ID of the entity type to be upgraded",
"type": "string",
"format": "UUID"
},
"fqlQuery": {
"description": "FQL query string to be used for the upgrade",
"type": "string"
},
"fields": {
"description": "List of fields to be included in the upgrade",
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"entityTypeId"
]
}
42 changes: 42 additions & 0 deletions src/main/resources/swagger.api/schemas/FqmMigrateResponse.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Entity Upgrade Response",
"description": "Schema for a response to upgrade FQM",
"type": "object",
"properties": {
"entityTypeId": {
"description": "ID of the entity type upgraded successfully",
"type": "string",
"format": "UUID"
},
"fqlQuery": {
"description": "FQL query string upgraded successfully",
"type": "string"
},
"fields": {
"description": "List of fields upgraded successfully",
"type": "array",
"items": {
"type": "string"
}
},
"warnings": {
"description": "List of warnings issued during the upgrade",
"type": "array",
"items": {
"type": "object",
"properties": {
"description": {
"type": "string"
},
"type": {
"type": "string"
}
}
}
}
},
"required": [
"entityTypeId"
]
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,39 @@
package org.folio.fqm.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.folio.fqm.domain.dto.FqmMigrateRequest;
import org.folio.fqm.migration.MigratableQueryInformation;
import org.folio.fqm.migration.warnings.DeprecatedEntityWarning;
import org.folio.fqm.migration.warnings.Warning;
import org.folio.fqm.resource.MigrationController;
import org.folio.fqm.service.MigrationService;
import org.folio.spring.FolioExecutionContext;
import org.folio.spring.i18n.service.TranslationService;
import org.folio.spring.integration.XOkapiHeaders;
import org.jetbrains.annotations.NotNull;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

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

import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.http.MediaType.APPLICATION_JSON;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

@WebMvcTest(MigrationController.class)
class MigrationControllerTest {
private static final String GET_VERSION_URL = "/fqm/version";

private static final String POST_FQM_MIGRATE_REQUEST = "/fqm/migrate";
@Autowired
private MockMvc mockMvc;

Expand All @@ -28,17 +43,61 @@ class MigrationControllerTest {
@MockBean
private FolioExecutionContext executionContext;

@MockBean
private TranslationService translationService;

@Test
void shouldReturnVersion() throws Exception {
String tenantId = "tenant_01";
when(executionContext.getTenantId()).thenReturn(tenantId);
when(migrationService.getLatestVersion()).thenReturn("1");
RequestBuilder builder = MockMvcRequestBuilders
.get(GET_VERSION_URL)
.accept(MediaType.APPLICATION_JSON);
.accept(APPLICATION_JSON);
mockMvc
.perform(builder)
.andExpect(status().isOk())
.andExpect(content().string("1"));
}

@Test
void shouldMigrateFqmSuccessfully() throws Exception {
String tenantId = "tenant_01";
UUID entityTypeID = UUID.randomUUID();
FqmMigrateRequest fqmMigrateRequest = getFqmMigrateRequest(entityTypeID);

MigratableQueryInformation migratableQueryInformation = mock(MigratableQueryInformation.class);

Warning deprecatedEntityWarning = new DeprecatedEntityWarning("abc", "def");
List<Warning> warningList = List.of(deprecatedEntityWarning);

when(executionContext.getTenantId()).thenReturn(tenantId);
when(migratableQueryInformation.entityTypeId()).thenReturn(entityTypeID);
when(migratableQueryInformation.fqlQuery()).thenReturn("users.active");
when(migratableQueryInformation.fields()).thenReturn(List.of("field1", "field2"));
when(migratableQueryInformation.warnings()).thenReturn(warningList);

when(migrationService.migrate(any(MigratableQueryInformation.class))).thenReturn(migratableQueryInformation);

RequestBuilder builder = MockMvcRequestBuilders
.post(POST_FQM_MIGRATE_REQUEST)
.header(XOkapiHeaders.TENANT, tenantId)
.contentType(APPLICATION_JSON)
.content(new ObjectMapper().writeValueAsString(fqmMigrateRequest));

mockMvc
.perform(builder)
.andExpect(status().isOk())
.andExpect(jsonPath("$.entityTypeId", is(entityTypeID.toString())))
.andExpect(jsonPath("$.fqlQuery", is("users.active")))
.andExpect(jsonPath("$.fields", is(List.of("field1", "field2"))));
}
@NotNull
private static FqmMigrateRequest getFqmMigrateRequest(UUID entityTypeID) {
FqmMigrateRequest fqmMigrateRequest = new FqmMigrateRequest();
fqmMigrateRequest.setEntityTypeId(entityTypeID);
fqmMigrateRequest.setFqlQuery("users.active");
fqmMigrateRequest.setFields(List.of("field1", "field2"));
return fqmMigrateRequest;
}
}

0 comments on commit c8890da

Please sign in to comment.