Commit ba0c9556 authored by Artem Hrybeniuk's avatar Artem Hrybeniuk
Browse files

Merge branch '303-aclsid-list-endpoint-by-sysuser-and-oauthclient' into 'main'

Resolve "AclSid autocomplete endpoint by SysUser and OAuthClient"

Closes #303

See merge request grin-global/grin-global-server!400
parents 144988f6 6a567714
/*
* Copyright 2022 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gringlobal.api.v1.impl;
import com.querydsl.core.types.dsl.BooleanExpression;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.genesys.blocks.oauth.model.QOAuthClient;
import org.genesys.blocks.oauth.persistence.OAuthClientRepository;
import org.genesys.blocks.security.model.AclSid;
import org.gringlobal.api.v1.ApiBaseController;
import org.gringlobal.api.v1.Pagination;
import org.gringlobal.model.QSysUser;
import org.gringlobal.persistence.SysUserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController("aclSidRelatedApi1")
@RequestMapping(AclSidRelatedController.API_URL)
@PreAuthorize("isAuthenticated()")
@Tag(name = "AclSid")
public class AclSidRelatedController {
/** The Constant API_URL. */
public static final String API_URL = ApiBaseController.APIv1_BASE + "/aclsid";
@Autowired
private SysUserRepository userRepository;
@Autowired
private OAuthClientRepository oAuthClientRepository;
/**
* Auto-complete AclSid by SysUser and OAuth-client.
*
* @param term the search term
*/
@GetMapping(value = "/autocomplete", produces = MediaType.APPLICATION_JSON_VALUE)
public List<AclSid> autocompleteAclSid(@RequestParam(value = "term", defaultValue = "") final String term) {
List<AclSid> aclSids = new ArrayList<>();
var termForSearch = StringUtils.stripToEmpty(term);
BooleanExpression sysUserExpression = QSysUser.sysUser.username.containsIgnoreCase(termForSearch).or(QSysUser.sysUser.cooperator.email.containsIgnoreCase(termForSearch));
aclSids.addAll(userRepository.findAll(sysUserExpression, Pagination.toPageRequest(10, Sort.by(Sort.Direction.ASC, "username"))).getContent());
BooleanExpression oAuthClientExpression = QOAuthClient.oAuthClient.title.containsIgnoreCase(termForSearch).or(QOAuthClient.oAuthClient.clientId.containsIgnoreCase(termForSearch));
aclSids.addAll(oAuthClientRepository.findAll(oAuthClientExpression, Pagination.toPageRequest(10, Sort.by(Sort.Direction.ASC, "clientId"))).getContent());
return aclSids;
}
}
/*
* Copyright 2022 Global Crop Diversity Trust
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gringlobal.test.api.v1;
import org.genesys.blocks.oauth.persistence.OAuthClientRepository;
import org.gringlobal.api.v1.impl.AclSidRelatedController;
import org.gringlobal.model.Cooperator;
import org.gringlobal.model.SysUser;
import org.gringlobal.persistence.SysUserRepository;
import org.gringlobal.test.service.AbstractServicesTest;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithUserDetails;
import org.springframework.transaction.annotation.Transactional;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.core.IsNull.notNullValue;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
@WithUserDetails(value = AbstractServicesTest.USER_ADMINISTRATOR)
public class AclSidRelatedControllerTest extends AbstractApiV1Test {
private static final String USERNAME = "testUser1";
private static final String USERNAME_2 = "testUser2";
private static final String PASSWORD = "PassW03d!";
private static final String PASSWORD_2 = "PassW03d!2";
private SysUser user;
private SysUser user2;
@Autowired
private SysUserRepository userRepository;
@Autowired
private OAuthClientRepository oAuthClientRepository;
@Before
@Override
@Transactional
public void beforeTest() throws Exception {
super.beforeTest();
SysUser toSave = new SysUser();
toSave.setUsername(USERNAME);
toSave.setPassword(PASSWORD);
toSave.setCooperator(cooperator);
user = userService.create(toSave);
assertThat(user, is(notNullValue()));
Cooperator cooperator2 = cooperatorRepository.findAll().get(1);
SysUser toSave2 = new SysUser();
toSave2.setUsername(USERNAME_2);
toSave2.setPassword(PASSWORD_2);
toSave2.setCooperator(cooperator2);
user2 = userService.create(toSave2);
assertThat(user2, is(notNullValue()));
}
@Test
public void autocompleteAclSidTest() throws Exception{
/*@formatter:off*/
mockMvc
.perform(get(AclSidRelatedController.API_URL.concat("/autocomplete?term={term}"), "user2")
.contentType(MediaType.APPLICATION_JSON))
// .andDo(org.springframework.test.web.servlet.result.MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(jsonPath("$", not(nullValue())))
.andExpect(jsonPath("$", hasSize(1)))
.andExpect(jsonPath("$[0].id", is(user2.getId().intValue())))
;
/*@formatter:on*/
/*@formatter:off*/
mockMvc
.perform(get(AclSidRelatedController.API_URL.concat("/autocomplete?term={term}"), "user1")
.contentType(MediaType.APPLICATION_JSON))
// .andDo(org.springframework.test.web.servlet.result.MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(jsonPath("$", not(nullValue())))
.andExpect(jsonPath("$", hasSize(1)))
.andExpect(jsonPath("$[0].id", is(user.getId().intValue())))
;
/*@formatter:on*/
/*@formatter:off*/
mockMvc
.perform(get(AclSidRelatedController.API_URL.concat("/autocomplete?term={term}"), "user")
.contentType(MediaType.APPLICATION_JSON))
// .andDo(org.springframework.test.web.servlet.result.MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(jsonPath("$", not(nullValue())))
.andExpect(jsonPath("$", hasSize(2)))
.andExpect(jsonPath("$[0].id", is(user.getId().intValue())))
.andExpect(jsonPath("$[1].id", is(user2.getId().intValue())))
;
/*@formatter:on*/
var users = userRepository.findAll(Sort.by(Sort.Direction.ASC, "id"));
var clients = oAuthClientRepository.findAll(Sort.by(Sort.Direction.ASC, "id"));
/*@formatter:off*/
mockMvc
.perform(get(AclSidRelatedController.API_URL.concat("/autocomplete"))
.contentType(MediaType.APPLICATION_JSON))
// .andDo(org.springframework.test.web.servlet.result.MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(jsonPath("$", not(nullValue())))
.andExpect(jsonPath("$", hasSize(users.size() + clients.size())))
;
/*@formatter:on*/
/*@formatter:off*/
mockMvc
.perform(get(AclSidRelatedController.API_URL.concat("/autocomplete?term={term}"), " ")
.contentType(MediaType.APPLICATION_JSON))
// .andDo(org.springframework.test.web.servlet.result.MockMvcResultHandlers.print())
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_VALUE))
.andExpect(jsonPath("$", not(nullValue())))
.andExpect(jsonPath("$", hasSize(users.size() + clients.size())))
;
/*@formatter:on*/
}
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment