From c80113e6600b94176472d71d81856428b1311efb Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 27 Feb 2024 11:10:21 +0300 Subject: [PATCH 1/5] EPMRPP-89420 search and filter organizations --- .../commons/querygen/FilterTarget.java | 44 +++++++ .../constant/GeneralCriteriaConstant.java | 2 + .../OrganizationCriteriaConstant.java | 33 ++++++ .../constant/ProjectCriteriaConstant.java | 1 + .../OrganizationRepositoryCustom.java | 39 +++++++ .../OrganizationRepositoryCustomImpl.java | 107 ++++++++++++++++++ .../reportportal/dao/util/RecordMappers.java | 9 ++ .../reportportal/dao/util/ResultFetchers.java | 20 ++++ .../OrganizationRepositoryCustomTest.java | 85 ++++++++++++++ .../OrganizationRepositoryTest.java | 58 ---------- 10 files changed, 340 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/epam/ta/reportportal/commons/querygen/constant/OrganizationCriteriaConstant.java create mode 100644 src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustom.java create mode 100644 src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomImpl.java create mode 100644 src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomTest.java delete mode 100644 src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryTest.java diff --git a/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java b/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java index fbcd395ad..99d612afd 100644 --- a/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java +++ b/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java @@ -37,6 +37,7 @@ import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_OWNER; import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_PROJECT; import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_PROJECT_ID; +import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_SLUG; import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_START_TIME; import static com.epam.ta.reportportal.commons.querygen.constant.GeneralCriteriaConstant.CRITERIA_USER_ID; import static com.epam.ta.reportportal.commons.querygen.constant.IntegrationCriteriaConstant.CRITERIA_INTEGRATION_TYPE; @@ -65,12 +66,15 @@ import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_LOG_PROJECT_ID; import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_LOG_TIME; import static com.epam.ta.reportportal.commons.querygen.constant.LogCriteriaConstant.CRITERIA_TEST_ITEM_ID; +import static com.epam.ta.reportportal.commons.querygen.constant.OrganizationCriteriaConstant.CRITERIA_ORG_CREATED_DATE; +import static com.epam.ta.reportportal.commons.querygen.constant.OrganizationCriteriaConstant.CRITERIA_ORG_TYPE; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_ALLOCATED_STORAGE; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_ATTRIBUTE_NAME; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_CREATION_DATE; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_KEY; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_NAME; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_ORGANIZATION; +import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_ORGANIZATION_ID; import static com.epam.ta.reportportal.commons.querygen.constant.ProjectCriteriaConstant.CRITERIA_PROJECT_TYPE; import static com.epam.ta.reportportal.commons.querygen.constant.TestItemCriteriaConstant.CRITERIA_CLUSTER_ID; import static com.epam.ta.reportportal.commons.querygen.constant.TestItemCriteriaConstant.CRITERIA_DURATION; @@ -153,6 +157,7 @@ import com.epam.ta.reportportal.entity.item.TestItem; import com.epam.ta.reportportal.entity.launch.Launch; import com.epam.ta.reportportal.entity.log.Log; +import com.epam.ta.reportportal.entity.organization.Organization; import com.epam.ta.reportportal.entity.project.Project; import com.epam.ta.reportportal.entity.project.ProjectInfo; import com.epam.ta.reportportal.entity.user.User; @@ -189,6 +194,9 @@ public enum FilterTarget { .get(), new CriteriaHolderBuilder().newBuilder(CRITERIA_PROJECT_ORGANIZATION, PROJECT.ORGANIZATION, String.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_SLUG, PROJECT.SLUG, String.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_PROJECT_ORGANIZATION_ID, + PROJECT.ORGANIZATION_ID, Long.class).get(), new CriteriaHolderBuilder().newBuilder(CRITERIA_PROJECT_TYPE, PROJECT.PROJECT_TYPE, String.class).get(), new CriteriaHolderBuilder().newBuilder(CRITERIA_PROJECT_ATTRIBUTE_NAME, @@ -1401,6 +1409,42 @@ protected void joinTables(QuerySupplier query) { protected Field idField() { return FILTER.ID; } + }, + + ORGANIZATION_TARGET(Organization.class, Arrays.asList( + new CriteriaHolderBuilder().newBuilder(CRITERIA_ID, ORGANIZATION.ID, Long.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_NAME, ORGANIZATION.NAME, String.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_SLUG, ORGANIZATION.SLUG, String.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_ORG_CREATED_DATE, ORGANIZATION.CREATION_DATE, + Timestamp.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_ORG_TYPE, ORGANIZATION.ORGANIZATION_TYPE, + String.class).get() + )) { + @Override + protected Collection selectFields() { + return Lists.newArrayList(ORGANIZATION.ID, + ORGANIZATION.ID, + ORGANIZATION.NAME, + ORGANIZATION.SLUG, + ORGANIZATION.CREATION_DATE, + ORGANIZATION.ORGANIZATION_TYPE + ); + } + + @Override + protected void addFrom(SelectQuery query) { + query.addFrom(ORGANIZATION); + } + + @Override + protected void joinTables(QuerySupplier query) { + + } + + @Override + protected Field idField() { + return ORGANIZATION.ID.cast(Long.class); + } }; public static final String FILTERED_QUERY = "filtered"; diff --git a/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/GeneralCriteriaConstant.java b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/GeneralCriteriaConstant.java index d0ec9e4a9..657c49048 100644 --- a/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/GeneralCriteriaConstant.java +++ b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/GeneralCriteriaConstant.java @@ -35,6 +35,8 @@ public final class GeneralCriteriaConstant { public static final String CRITERIA_LAUNCH_ID = "launchId"; public static final String CRITERIA_START_TIME = "startTime"; public static final String CRITERIA_END_TIME = "endTime"; + public static final String CRITERIA_SLUG = "slug"; + private GeneralCriteriaConstant() { //static only diff --git a/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/OrganizationCriteriaConstant.java b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/OrganizationCriteriaConstant.java new file mode 100644 index 000000000..3e4b80d06 --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/OrganizationCriteriaConstant.java @@ -0,0 +1,33 @@ +/* + * Copyright 2024 EPAM Systems + * + * 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 com.epam.ta.reportportal.commons.querygen.constant; + +/** + * Search criteria fields for Organization. + * + * @author Siarhei Hrabko + */ +public final class OrganizationCriteriaConstant { + + public static final String CRITERIA_ORG_TYPE = "organization_type"; + public static final String CRITERIA_ORG_CREATED_DATE = "creation_date"; + + + private OrganizationCriteriaConstant() { + //static only + } +} diff --git a/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/ProjectCriteriaConstant.java b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/ProjectCriteriaConstant.java index 2b2de0004..13ce1d753 100644 --- a/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/ProjectCriteriaConstant.java +++ b/src/main/java/com/epam/ta/reportportal/commons/querygen/constant/ProjectCriteriaConstant.java @@ -27,6 +27,7 @@ public final class ProjectCriteriaConstant { public static final String CRITERIA_PROJECT_SLUG = "slug"; public static final String CRITERIA_ALLOCATED_STORAGE = "allocatedStorage"; public static final String CRITERIA_PROJECT_ORGANIZATION = "organization"; + public static final String CRITERIA_PROJECT_ORGANIZATION_ID = "organization_id"; public static final String CRITERIA_PROJECT_CREATION_DATE = "creationDate"; public static final String CRITERIA_PROJECT_ATTRIBUTE_NAME = "attributeName"; diff --git a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustom.java b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustom.java new file mode 100644 index 000000000..219b7d168 --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustom.java @@ -0,0 +1,39 @@ +/* + * Copyright 2024 EPAM Systems + * + * 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 com.epam.ta.reportportal.dao.organization; + +import com.epam.ta.reportportal.dao.FilterableRepository; +import com.epam.ta.reportportal.entity.organization.Organization; +import java.util.List; +import java.util.Optional; + +/** + * Repository interface for searching and filtering organization records. + * + * @author Siarhei Hrabko + */ +public interface OrganizationRepositoryCustom extends FilterableRepository { + + List findAllByUserLogin(String login); + + Optional findById(Long orgId); + + Optional findOrganizationByName(String name); + + Optional findOrganizationBySlug(String slug); + +} diff --git a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomImpl.java b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomImpl.java new file mode 100644 index 000000000..cbb57273c --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomImpl.java @@ -0,0 +1,107 @@ +/* + * Copyright 2024 EPAM Systems + * + * 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 com.epam.ta.reportportal.dao.organization; + +import static com.epam.ta.reportportal.dao.util.QueryUtils.collectJoinFields; +import static com.epam.ta.reportportal.dao.util.ResultFetchers.ORGANIZATION_FETCHER; +import static com.epam.ta.reportportal.jooq.Tables.ORGANIZATION; +import static com.epam.ta.reportportal.jooq.Tables.ORGANIZATION_USER; +import static com.epam.ta.reportportal.jooq.Tables.USERS; + +import com.epam.ta.reportportal.commons.querygen.QueryBuilder; +import com.epam.ta.reportportal.commons.querygen.Queryable; +import com.epam.ta.reportportal.entity.organization.Organization; +import java.util.List; +import java.util.Optional; +import org.jooq.DSLContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.support.PageableExecutionUtils; +import org.springframework.stereotype.Repository; + +/** + * Repository implementation class for searching and filtering organization records. + * + * @author Siarhei Hrabko + */ +@Repository +public class OrganizationRepositoryCustomImpl implements OrganizationRepositoryCustom { + + @Autowired + private DSLContext dsl; + + @Override + public List findByFilter(Queryable filter) { + return ORGANIZATION_FETCHER.apply( + dsl.fetch(QueryBuilder.newBuilder(filter, collectJoinFields(filter)) + .wrap() + .build())); + } + + @Override + public Page findByFilter(Queryable filter, Pageable pageable) { + return PageableExecutionUtils.getPage( + ORGANIZATION_FETCHER.apply( + dsl.fetch(QueryBuilder.newBuilder(filter, collectJoinFields(filter, pageable.getSort())) + .with(pageable) + .wrap() + .withWrapperSort(pageable.getSort()) + .build())), + pageable, + () -> dsl.fetchCount(QueryBuilder.newBuilder(filter).build()) + ); + } + + + @Override + public List findAllByUserLogin(String login) { + return ORGANIZATION_FETCHER.apply(dsl.select(ORGANIZATION.fields()) + .from(ORGANIZATION) + .join(ORGANIZATION_USER) + .on(ORGANIZATION.ID.eq(ORGANIZATION_USER.ORGANIZATION_ID)) + .join(USERS) + .on(ORGANIZATION_USER.USER_ID.eq(USERS.ID)) + .where(USERS.LOGIN.eq(login)) + .fetch()); + } + + @Override + public Optional findById(Long orgId) { + return dsl.select() + .from(ORGANIZATION) + .where(ORGANIZATION.ID.eq(orgId)) + .fetchOptionalInto(Organization.class); + } + + @Override + public Optional findOrganizationByName(String name) { + return dsl.select() + .from(ORGANIZATION) + .where(ORGANIZATION.NAME.eq(name)) + .fetchOptionalInto(Organization.class); + } + + @Override + public Optional findOrganizationBySlug(String slug) { + return dsl.select() + .from(ORGANIZATION) + .where(ORGANIZATION.SLUG.eq(slug)) + .fetchOptionalInto(Organization.class); + } + +} diff --git a/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java b/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java index b8df3bcb9..7baca9081 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java +++ b/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java @@ -191,6 +191,15 @@ public class RecordMappers { return project; }; + /** + * Maps record into {@link Organization} object + */ + public static final RecordMapper ORGANIZATION_MAPPER = row -> { + Organization project = row.into(Organization.class); + + return project; + }; + /** * Maps record into {@link TestItemResults} object */ diff --git a/src/main/java/com/epam/ta/reportportal/dao/util/ResultFetchers.java b/src/main/java/com/epam/ta/reportportal/dao/util/ResultFetchers.java index 579ed0298..53786a11a 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/util/ResultFetchers.java +++ b/src/main/java/com/epam/ta/reportportal/dao/util/ResultFetchers.java @@ -56,6 +56,7 @@ import com.epam.ta.reportportal.entity.item.TestItem; import com.epam.ta.reportportal.entity.launch.Launch; import com.epam.ta.reportportal.entity.log.Log; +import com.epam.ta.reportportal.entity.organization.Organization; import com.epam.ta.reportportal.entity.pattern.PatternTemplateTestItem; import com.epam.ta.reportportal.entity.project.Project; import com.epam.ta.reportportal.entity.project.ProjectAttribute; @@ -121,6 +122,25 @@ private ResultFetchers() { return new ArrayList<>(projects.values()); }; + /** + * Fetches records from db results into list of {@link Organization} objects. + */ + public static final Function, List> ORGANIZATION_FETCHER = records -> { + Map orgs = Maps.newLinkedHashMap(); + records.forEach(record -> { + Long id = record.get(PROJECT.ID); + Organization organization; + if (!orgs.containsKey(id)) { + organization = RecordMappers.ORGANIZATION_MAPPER.map(record); + } else { + organization = orgs.get(id); + } + orgs.put(id, organization); + }); + + return new ArrayList<>(orgs.values()); + }; + /** * Fetches records from db results into list of {@link Launch} objects. */ diff --git a/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomTest.java b/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomTest.java new file mode 100644 index 000000000..df94768e5 --- /dev/null +++ b/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryCustomTest.java @@ -0,0 +1,85 @@ +/* + * Copyright 2024 EPAM Systems + * + * 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 com.epam.ta.reportportal.dao.organization; + +import static com.epam.ta.reportportal.entity.project.ProjectInfo.USERS_QUANTITY; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.springframework.test.util.AssertionErrors.assertTrue; + +import com.epam.ta.reportportal.BaseTest; +import com.epam.ta.reportportal.commons.querygen.Condition; +import com.epam.ta.reportportal.commons.querygen.Filter; +import com.epam.ta.reportportal.entity.organization.Organization; +import com.epam.ta.reportportal.entity.project.ProjectInfo; +import java.util.List; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Siarhei Hrabko + */ +class OrganizationRepositoryCustomTest extends BaseTest { + + @Autowired + private OrganizationRepositoryCustom organizationRepositoryCustom; + + @Test + void findByNameTest() { + String name = "My organization"; + Optional organization = organizationRepositoryCustom.findOrganizationByName(name); + assertTrue("Organization not found", organization.isPresent()); + } + + @Test + void findBySlugTest() { + String slug = "my-organization"; + Optional organization = organizationRepositoryCustom.findOrganizationBySlug(slug); + assertTrue("Organization not found", organization.isPresent()); + } + + @Test + void findByIdTest() { + Optional organization = organizationRepositoryCustom.findById(1L); + assertTrue("Organization not found", organization.isPresent()); + } + + @Test + void organizationByFilterNotFound() { + final List orgs = organizationRepositoryCustom.findByFilter( + new Filter(Organization.class, + Condition.EQUALS, + false, + "wubba-lubba-dub-dub", + "slug" + )); + assertEquals(0, orgs.size()); + } + + @Test + void findOrganizationByFilter() { + final List orgs = organizationRepositoryCustom.findByFilter( + new Filter(Organization.class, + Condition.EQUALS, + false, + "my-organization", + "slug" + )); + assertEquals(1, orgs.size()); + } + +} diff --git a/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryTest.java b/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryTest.java deleted file mode 100644 index 46c325c34..000000000 --- a/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationRepositoryTest.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright 2024 EPAM Systems - * - * 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 com.epam.ta.reportportal.dao.organization; - -import static org.springframework.test.util.AssertionErrors.assertTrue; - -import com.epam.ta.reportportal.BaseTest; -import com.epam.ta.reportportal.entity.organization.Organization; -import java.util.Optional; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; - -/** - * @author Siarhei Hrabko - */ -class OrganizationRepositoryTest extends BaseTest { - - @Autowired - private OrganizationRepository organizationRepository; - - @Test - void findByNameTest() { - //given - String name = "My organization"; - - //when - Optional organization = organizationRepository.findByName(name); - - //then - assertTrue("Organization found", organization.isPresent()); - } - - @Test - void findBySlugTest() { - //given - String slug = "my-organization"; - - //when - Optional organization = organizationRepository.findBySlug(slug); - - //then - assertTrue("Organization found", organization.isPresent()); - } -} From ffc7c4977a6d87f038395fce9b458ff97269d256 Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 27 Feb 2024 11:18:22 +0300 Subject: [PATCH 2/5] EPMRPP-89420 remove OrganizationRepository.java by security reasons --- .../organization/OrganizationRepository.java | 40 ------------------- 1 file changed, 40 deletions(-) delete mode 100644 src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepository.java diff --git a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepository.java b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepository.java deleted file mode 100644 index 0ae826939..000000000 --- a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationRepository.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2024 EPAM Systems - * - * 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 com.epam.ta.reportportal.dao.organization; - -import com.epam.ta.reportportal.dao.ReportPortalRepository; -import com.epam.ta.reportportal.entity.organization.Organization; - -import java.util.Optional; - -/** - * @author Siarhei Hrabko - */ -public interface OrganizationRepository extends ReportPortalRepository { - - /** - * @param name name of organization - * @return {@link Optional} of {@link Organization} - */ - Optional findByName(String name); - - /** - * @param slug slug name of organization - * @return {@link Optional} of {@link Organization} - */ - Optional findBySlug(String slug); -} From 807d1829be0a97e2fdf4c96020a1e54e946697ae Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 27 Feb 2024 12:08:28 +0300 Subject: [PATCH 3/5] EPMRPP-89420 fix many-to-one relationship --- .../com/epam/ta/reportportal/commons/querygen/FilterTarget.java | 1 - .../java/com/epam/ta/reportportal/entity/project/Project.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java b/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java index 99d612afd..4ca6335c6 100644 --- a/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java +++ b/src/main/java/com/epam/ta/reportportal/commons/querygen/FilterTarget.java @@ -149,7 +149,6 @@ import com.epam.ta.reportportal.commons.querygen.query.JoinEntity; import com.epam.ta.reportportal.commons.querygen.query.QuerySupplier; import com.epam.ta.reportportal.entity.activity.Activity; -import com.epam.ta.reportportal.entity.activity.EventSubject; import com.epam.ta.reportportal.entity.dashboard.Dashboard; import com.epam.ta.reportportal.entity.enums.LogLevel; import com.epam.ta.reportportal.entity.filter.UserFilter; diff --git a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java index 2639918c3..9af0d23fd 100644 --- a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java +++ b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java @@ -98,7 +98,7 @@ public class Project implements Serializable { @Column(name = "organization") private String org; - @ManyToOne(fetch = FetchType.LAZY) + @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @MapsId("organization_id") private Organization organization; From a7af6168dc9743df413531817123bed9f0a8d4b0 Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 27 Feb 2024 12:24:40 +0300 Subject: [PATCH 4/5] EPMRPP-89420 fix many-to-one relationship --- .../java/com/epam/ta/reportportal/entity/project/Project.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java index 9af0d23fd..a32c27826 100644 --- a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java +++ b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java @@ -98,7 +98,9 @@ public class Project implements Serializable { @Column(name = "organization") private String org; - @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) + @ManyToOne( + fetch = FetchType.LAZY, + cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) @MapsId("organization_id") private Organization organization; From 90ff7e0f66d79c4d5312de718596f52632f82c4d Mon Sep 17 00:00:00 2001 From: siarhei_hrabko Date: Tue, 27 Feb 2024 14:13:57 +0300 Subject: [PATCH 5/5] EPMRPP-89420 fix many-to-one relationship --- .../com/epam/ta/reportportal/dao/util/RecordMappers.java | 5 +---- .../com/epam/ta/reportportal/entity/project/Project.java | 7 ++----- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java b/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java index 7baca9081..0ba7688ff 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java +++ b/src/main/java/com/epam/ta/reportportal/dao/util/RecordMappers.java @@ -400,16 +400,13 @@ public class RecordMappers { ProjectUser projectUser = new ProjectUser(); projectUser.setProjectRole(r.into(PROJECT_USER.PROJECT_ROLE).into(ProjectRole.class)); - Organization organization = new Organization(); - organization.setId(r.get(ORGANIZATION.ID)); - Project project = new Project(); project.setId(r.get(PROJECT_USER.PROJECT_ID)); project.setName(r.get(PROJECT.NAME)); project.setKey(r.get(PROJECT.KEY)); project.setSlug(r.get(PROJECT.SLUG)); project.setProjectType(ProjectType.valueOf(r.get(PROJECT.PROJECT_TYPE))); - project.setOrganization(organization); + project.setOrganizationId(r.get(ORGANIZATION.ID)); User user = new User(); user.setLogin(r.get(USERS.LOGIN)); diff --git a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java index a32c27826..68ab63ded 100644 --- a/src/main/java/com/epam/ta/reportportal/entity/project/Project.java +++ b/src/main/java/com/epam/ta/reportportal/entity/project/Project.java @@ -98,11 +98,8 @@ public class Project implements Serializable { @Column(name = "organization") private String org; - @ManyToOne( - fetch = FetchType.LAZY, - cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE}) - @MapsId("organization_id") - private Organization organization; + @Column(name = "organization_id", nullable = false) + private Long organizationId; @Column(name = "key") private String key;