From d0b04dd2addc099b79a11431a26e4dfee43a6145 Mon Sep 17 00:00:00 2001 From: Siarhei Hrabko <45555481+grabsefx@users.noreply.github.com> Date: Fri, 7 Jun 2024 16:05:29 +0300 Subject: [PATCH] EPMRPP-90460 projects controller (#1012) * EPMRPP-90460 implement Organization Project DAO --- project-properties.gradle | 1 + .../commons/querygen/FilterTarget.java | 68 +++++++++++++++++-- .../OrganizationUserRepository.java | 15 +++- .../OrganizationProjectRepository.java | 12 ++++ .../OrganizationProjectRepositoryImpl.java | 34 ++++++++++ .../reportportal/dao/util/ResultFetchers.java | 48 +++++++++++++ .../ta/reportportal/jooq/tables/JProject.java | 15 ++-- .../jooq/tables/records/JProjectRecord.java | 59 +++++++++++++--- .../model/ProjectRelationLaunches.java | 6 +- .../model/ProjectRelationLaunchesMeta.java | 37 ++++++++-- .../ta/reportportal/util/OffsetUtils.java | 40 +++++++++++ .../OrganizationUserRepositoryTest.java | 58 ++++++++++++++++ .../OrganizationProjectRepositoryTest.java | 54 +++++++++++++++ 13 files changed, 419 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepository.java create mode 100644 src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryImpl.java create mode 100644 src/main/java/com/epam/ta/reportportal/util/OffsetUtils.java create mode 100644 src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepositoryTest.java create mode 100644 src/test/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryTest.java diff --git a/project-properties.gradle b/project-properties.gradle index 39536ea42..7012d643e 100755 --- a/project-properties.gradle +++ b/project-properties.gradle @@ -87,6 +87,7 @@ project.ext { (migrationsUrl + '/migrations/89_add_group_enum_value.up.sql') : 'V089__add_group_enum_value.sql', (migrationsUrl + '/migrations/200_migrate_org_roles.up.sql') : 'V200__migrate_org_roles.sql', (migrationsUrl + '/migrations/201_drop_table_onboarding.up.sql') : 'V201__drop_table_onboarding.sql', + (migrationsUrl + '/migrations/202_update_project_table.up.sql') : 'V202__update_project_table.up.sql', ] excludeTests = [ 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 b8b7012ac..abb70f59c 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 @@ -169,7 +169,7 @@ import com.epam.ta.reportportal.jooq.enums.JLaunchModeEnum; import com.epam.ta.reportportal.jooq.enums.JStatusEnum; import com.epam.ta.reportportal.jooq.enums.JTestItemTypeEnum; -import com.epam.ta.reportportal.model.OrganizationInfo; +import com.epam.ta.reportportal.model.ProjectProfile; import com.google.common.collect.Lists; import java.sql.Timestamp; import java.util.ArrayList; @@ -1555,17 +1555,75 @@ protected Field idField() { return ORGANIZATION.ID.cast(Long.class); } -/* @Override + }, + + PROJECT_PROFILE(ProjectProfile.class, + Arrays.asList( + new CriteriaHolderBuilder().newBuilder(CRITERIA_ORG_ID, PROJECT.ORGANIZATION_ID, Long.class) + .get(), + new CriteriaHolderBuilder().newBuilder(PROJECT_USER.USER_ID.getName(), PROJECT_USER.USER_ID, Long.class) + .get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_NAME, PROJECT.NAME, String.class).get(), + new CriteriaHolderBuilder().newBuilder(CRITERIA_NAME, PROJECT.SLUG, String.class).get() + ) + ) { + @Override + public QuerySupplier getQuery() { + SelectQuery query = DSL.select(selectFields()).getQuery(); + addFrom(query); + query.addGroupBy(PROJECT.ID, PROJECT.CREATION_DATE, PROJECT.KEY, PROJECT.PROJECT_TYPE); + QuerySupplier querySupplier = new QuerySupplier(query); + joinTables(querySupplier); + return querySupplier; + } + + @Override + protected Collection selectFields() { + return Lists.newArrayList(DSL.countDistinct(PROJECT_USER.USER_ID).as(USERS_QUANTITY), + DSL.countDistinct(choose().when(LAUNCH.MODE.eq(JLaunchModeEnum.DEFAULT) + .and(LAUNCH.STATUS.ne(JStatusEnum.IN_PROGRESS)), + LAUNCH.ID + )).as(LAUNCHES_QUANTITY), + DSL.max(LAUNCH.START_TIME).as(LAST_RUN), + PROJECT.ID, + PROJECT.CREATION_DATE, + PROJECT.UPDATED_AT, + PROJECT.KEY, + PROJECT.SLUG, + PROJECT.NAME, + PROJECT.PROJECT_TYPE, + PROJECT.ORGANIZATION_ID + ); + } + + @Override + protected void addFrom(SelectQuery query) { + query.addFrom(PROJECT); + } + + @Override + protected void joinTables(QuerySupplier query) { + query.addJoin(PROJECT_USER, JoinType.LEFT_OUTER_JOIN, PROJECT.ID.eq(PROJECT_USER.PROJECT_ID)); + query.addJoin(LAUNCH, JoinType.LEFT_OUTER_JOIN, PROJECT.ID.eq(LAUNCH.PROJECT_ID)); + } + + @Override public QuerySupplier wrapQuery(SelectQuery query) { - throw new UnsupportedOperationException("Doesn't supported for Organization Info query"); + throw new UnsupportedOperationException("Operation not supported for ProjectProfile query"); } @Override public QuerySupplier wrapQuery(SelectQuery query, String... excluding) { - throw new UnsupportedOperationException("Doesn't supported for Organization Info query"); - }*/ + throw new UnsupportedOperationException("Operation not supported for ProjectProfile query"); + } + + @Override + protected Field idField() { + return PROJECT.ID; + } }; + public static final String FILTERED_QUERY = "filtered"; public static final String ATTRIBUTE_ALIAS = "attribute"; public static final String FILTERED_ID = "id"; diff --git a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepository.java b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepository.java index 2a1310258..cf41e9180 100644 --- a/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepository.java +++ b/src/main/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepository.java @@ -17,13 +17,26 @@ package com.epam.ta.reportportal.dao.organization; import com.epam.ta.reportportal.dao.ReportPortalRepository; -import com.epam.ta.reportportal.entity.user.OrganizationUserId; import com.epam.ta.reportportal.entity.user.OrganizationUser; +import com.epam.ta.reportportal.entity.user.OrganizationUserId; +import java.util.Optional; /** + * This interface represents a repository for the OrganizationUser entity. + * * @author Siarhei Hrabko */ public interface OrganizationUserRepository extends ReportPortalRepository { + /** + * This method is used to find a list of OrganizationUser entities by user ID and organization ID. + * It returns a list of OrganizationUser entities that match the given user ID and organization + * ID. + * + * @param userId The ID of the user. + * @param orgId The ID of the organization. + * @return A list of OrganizationUser entities that match the given user ID and organization ID. + */ + Optional findByUserIdAndOrganization_Id(Long userId, Long orgId); } diff --git a/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepository.java b/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepository.java new file mode 100644 index 000000000..641564c0f --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepository.java @@ -0,0 +1,12 @@ +package com.epam.ta.reportportal.dao.project; + +import com.epam.ta.reportportal.commons.querygen.Queryable; +import com.epam.ta.reportportal.model.ProjectProfile; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +public interface OrganizationProjectRepository { + + Page getProjectProfileListByFilter(Queryable filter, Pageable pageable); + +} diff --git a/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryImpl.java b/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryImpl.java new file mode 100644 index 000000000..5d3953adf --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryImpl.java @@ -0,0 +1,34 @@ +package com.epam.ta.reportportal.dao.project; + +import static com.epam.ta.reportportal.dao.util.ResultFetchers.ORGANIZATION_PROJECT_LIST_FETCHER; + +import com.epam.ta.reportportal.commons.querygen.FilterTarget; +import com.epam.ta.reportportal.commons.querygen.QueryBuilder; +import com.epam.ta.reportportal.commons.querygen.Queryable; +import com.epam.ta.reportportal.model.ProjectProfile; +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.support.PageableExecutionUtils; +import org.springframework.stereotype.Repository; + +@Repository +public class OrganizationProjectRepositoryImpl implements OrganizationProjectRepository { + + private DSLContext dsl; + + @Autowired + public void setDsl(DSLContext dsl) { + this.dsl = dsl; + } + + @Override + public Page getProjectProfileListByFilter(Queryable filter, Pageable pageable) { + return PageableExecutionUtils.getPage(ORGANIZATION_PROJECT_LIST_FETCHER.apply( + dsl.fetch(QueryBuilder.newBuilder(filter).with(pageable).build())), + pageable, + () -> dsl.fetchCount(QueryBuilder.newBuilder(FilterTarget.PROJECT_PROFILE).build())); + } + +} 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 2f5df15c9..bd1c92031 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 @@ -61,6 +61,7 @@ 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.organization.OrganizationFilter; import com.epam.ta.reportportal.entity.pattern.PatternTemplateTestItem; import com.epam.ta.reportportal.entity.project.Project; import com.epam.ta.reportportal.entity.project.ProjectAttribute; @@ -69,9 +70,16 @@ import com.epam.ta.reportportal.entity.user.UserRole; import com.epam.ta.reportportal.entity.widget.Widget; import com.epam.ta.reportportal.model.OrganizationProfile; +import com.epam.ta.reportportal.model.ProjectProfile; +import com.epam.ta.reportportal.model.ProjectRelation; +import com.epam.ta.reportportal.model.ProjectRelationLaunches; +import com.epam.ta.reportportal.model.ProjectRelationLaunchesMeta; +import com.epam.ta.reportportal.model.ProjectRelationUsers; +import com.epam.ta.reportportal.model.ProjectRelationUsersMeta; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import java.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -427,4 +435,44 @@ private ResultFetchers() { return null; }; + public static final Function, List> ORGANIZATION_PROJECT_LIST_FETCHER = rows -> { + List projectProfiles = new ArrayList<>(rows.size()); + + rows.forEach(row -> { + ProjectProfile projectProfile = new ProjectProfile(); + + projectProfile.setId(row.get(PROJECT.ID)); + projectProfile.setName(row.get(PROJECT.NAME)); + projectProfile.setOrganizationId(row.get(PROJECT.ORGANIZATION_ID)); + projectProfile.setCreatedAt(row.get(PROJECT.CREATION_DATE, Instant.class)); + projectProfile.setUpdatedAt(row.get(PROJECT.UPDATED_AT, Instant.class)); + projectProfile.setName(row.get(PROJECT.NAME)); + projectProfile.setKey(row.get(PROJECT.KEY)); + projectProfile.setSlug(row.get(PROJECT.SLUG)); + + ProjectRelationLaunches prl = new ProjectRelationLaunches(); + // set launches + prl.meta(new ProjectRelationLaunchesMeta() + .count(row.get(OrganizationFilter.LAUNCHES_QUANTITY, Integer.class)) + .lastOccurredAt(row.get(OrganizationFilter.LAST_RUN, Instant.class))); + + // set users + ProjectRelationUsersMeta usersMeta = new ProjectRelationUsersMeta() + .count(row.get(OrganizationFilter.USERS_QUANTITY, Integer.class)); + ProjectRelationUsers oru = new ProjectRelationUsers() + .meta(usersMeta); + + ProjectRelation projectRelation = new ProjectRelation() + .launches(prl) + .users(oru); + + projectProfile.setRelationships(projectRelation); + + projectProfiles.add(projectProfile); + + }); + + return projectProfiles; + }; + } diff --git a/src/main/java/com/epam/ta/reportportal/jooq/tables/JProject.java b/src/main/java/com/epam/ta/reportportal/jooq/tables/JProject.java index cf200adf4..a0f546206 100644 --- a/src/main/java/com/epam/ta/reportportal/jooq/tables/JProject.java +++ b/src/main/java/com/epam/ta/reportportal/jooq/tables/JProject.java @@ -22,7 +22,7 @@ import org.jooq.JSONB; import org.jooq.Name; import org.jooq.Record; -import org.jooq.Row10; +import org.jooq.Row11; import org.jooq.Schema; import org.jooq.Table; import org.jooq.TableField; @@ -44,7 +44,7 @@ @SuppressWarnings({ "all", "unchecked", "rawtypes" }) public class JProject extends TableImpl { - private static final long serialVersionUID = -1640494078; + private static final long serialVersionUID = -1307600510; /** * The reference instance of public.project @@ -109,6 +109,11 @@ public Class getRecordType() { */ public final TableField KEY = createField(DSL.name("key"), org.jooq.impl.SQLDataType.CLOB, this, ""); + /** + * The column public.project.updated_at. + */ + public final TableField UPDATED_AT = createField(DSL.name("updated_at"), org.jooq.impl.SQLDataType.TIMESTAMP.nullable(false).defaultValue(org.jooq.impl.DSL.field("now()", org.jooq.impl.SQLDataType.TIMESTAMP)), this, ""); + /** * Create a public.project table reference */ @@ -194,11 +199,11 @@ public JProject rename(Name name) { } // ------------------------------------------------------------------------- - // Row10 type methods + // Row11 type methods // ------------------------------------------------------------------------- @Override - public Row10 fieldsRow() { - return (Row10) super.fieldsRow(); + public Row11 fieldsRow() { + return (Row11) super.fieldsRow(); } } diff --git a/src/main/java/com/epam/ta/reportportal/jooq/tables/records/JProjectRecord.java b/src/main/java/com/epam/ta/reportportal/jooq/tables/records/JProjectRecord.java index 6a21631ee..601b7c3c4 100644 --- a/src/main/java/com/epam/ta/reportportal/jooq/tables/records/JProjectRecord.java +++ b/src/main/java/com/epam/ta/reportportal/jooq/tables/records/JProjectRecord.java @@ -13,8 +13,8 @@ import org.jooq.Field; import org.jooq.JSONB; import org.jooq.Record1; -import org.jooq.Record10; -import org.jooq.Row10; +import org.jooq.Record11; +import org.jooq.Row11; import org.jooq.impl.UpdatableRecordImpl; @@ -29,9 +29,9 @@ comments = "This class is generated by jOOQ" ) @SuppressWarnings({ "all", "unchecked", "rawtypes" }) -public class JProjectRecord extends UpdatableRecordImpl implements Record10 { +public class JProjectRecord extends UpdatableRecordImpl implements Record11 { - private static final long serialVersionUID = 2145940380; + private static final long serialVersionUID = 327627751; /** * Setter for public.project.id. @@ -173,6 +173,20 @@ public String getKey() { return (String) get(9); } + /** + * Setter for public.project.updated_at. + */ + public void setUpdatedAt(Timestamp value) { + set(10, value); + } + + /** + * Getter for public.project.updated_at. + */ + public Timestamp getUpdatedAt() { + return (Timestamp) get(10); + } + // ------------------------------------------------------------------------- // Primary key information // ------------------------------------------------------------------------- @@ -183,17 +197,17 @@ public Record1 key() { } // ------------------------------------------------------------------------- - // Record10 type implementation + // Record11 type implementation // ------------------------------------------------------------------------- @Override - public Row10 fieldsRow() { - return (Row10) super.fieldsRow(); + public Row11 fieldsRow() { + return (Row11) super.fieldsRow(); } @Override - public Row10 valuesRow() { - return (Row10) super.valuesRow(); + public Row11 valuesRow() { + return (Row11) super.valuesRow(); } @Override @@ -246,6 +260,11 @@ public Field field10() { return JProject.PROJECT.KEY; } + @Override + public Field field11() { + return JProject.PROJECT.UPDATED_AT; + } + @Override public Long component1() { return getId(); @@ -296,6 +315,11 @@ public String component10() { return getKey(); } + @Override + public Timestamp component11() { + return getUpdatedAt(); + } + @Override public Long value1() { return getId(); @@ -346,6 +370,11 @@ public String value10() { return getKey(); } + @Override + public Timestamp value11() { + return getUpdatedAt(); + } + @Override public JProjectRecord value1(Long value) { setId(value); @@ -407,7 +436,13 @@ public JProjectRecord value10(String value) { } @Override - public JProjectRecord values(Long value1, String value2, String value3, String value4, Timestamp value5, JSONB value6, Long value7, Long value8, String value9, String value10) { + public JProjectRecord value11(Timestamp value) { + setUpdatedAt(value); + return this; + } + + @Override + public JProjectRecord values(Long value1, String value2, String value3, String value4, Timestamp value5, JSONB value6, Long value7, Long value8, String value9, String value10, Timestamp value11) { value1(value1); value2(value2); value3(value3); @@ -418,6 +453,7 @@ public JProjectRecord values(Long value1, String value2, String value3, String v value8(value8); value9(value9); value10(value10); + value11(value11); return this; } @@ -435,7 +471,7 @@ public JProjectRecord() { /** * Create a detached, initialised JProjectRecord */ - public JProjectRecord(Long id, String name, String projectType, String organization, Timestamp creationDate, JSONB metadata, Long allocatedStorage, Long organizationId, String slug, String key) { + public JProjectRecord(Long id, String name, String projectType, String organization, Timestamp creationDate, JSONB metadata, Long allocatedStorage, Long organizationId, String slug, String key, Timestamp updatedAt) { super(JProject.PROJECT); set(0, id); @@ -448,5 +484,6 @@ public JProjectRecord(Long id, String name, String projectType, String organizat set(7, organizationId); set(8, slug); set(9, key); + set(10, updatedAt); } } diff --git a/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunches.java b/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunches.java index 99c3819f5..48abbc3a2 100644 --- a/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunches.java +++ b/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunches.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import java.util.Objects; import javax.validation.Valid; +import javax.validation.constraints.NotNull; import org.springframework.validation.annotation.Validated; /** @@ -11,7 +12,7 @@ */ @Schema(description = "Launches associated with the project.") @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-05-14T12:57:43.836661731+03:00[Europe/Istanbul]") + public class ProjectRelationLaunches { @@ -28,7 +29,8 @@ public ProjectRelationLaunches meta(ProjectRelationLaunchesMeta meta) { * @return meta **/ @Schema(description = "") - + @NotNull + @Valid public ProjectRelationLaunchesMeta getMeta() { return meta; diff --git a/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunchesMeta.java b/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunchesMeta.java index 237b2a76e..cb2d276d5 100644 --- a/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunchesMeta.java +++ b/src/main/java/com/epam/ta/reportportal/model/ProjectRelationLaunchesMeta.java @@ -5,19 +5,24 @@ import java.time.Instant; import java.util.Objects; import javax.validation.Valid; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; import org.springframework.validation.annotation.Validated; /** * ProjectRelationLaunchesMeta */ @Validated -@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2024-05-14T12:57:43.836661731+03:00[Europe/Istanbul]") + public class ProjectRelationLaunchesMeta { @JsonProperty("last_occurred_at") private Instant lastOccurredAt = null; + @JsonProperty("count") + private Integer count = null; + public ProjectRelationLaunchesMeta lastOccurredAt(Instant lastOccurredAt) { this.lastOccurredAt = lastOccurredAt; return this; @@ -28,7 +33,8 @@ public ProjectRelationLaunchesMeta lastOccurredAt(Instant lastOccurredAt) { * @return lastOccurredAt **/ @Schema(description = "The date and time of the last launch occurred in the project.") - + @NotNull + @Valid public Instant getLastOccurredAt() { return lastOccurredAt; @@ -38,6 +44,27 @@ public void setLastOccurredAt(Instant lastOccurredAt) { this.lastOccurredAt = lastOccurredAt; } + public ProjectRelationLaunchesMeta count(Integer count) { + this.count = count; + return this; + } + + /** + * Total number of launches in the project. + * minimum: 0 + * @return count + **/ + @Schema(description = "Total number of launches in the project.") + @NotNull + + @Min(0) public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } + @Override public boolean equals(Object o) { @@ -48,12 +75,13 @@ public boolean equals(Object o) { return false; } ProjectRelationLaunchesMeta projectRelationLaunchesMeta = (ProjectRelationLaunchesMeta) o; - return Objects.equals(this.lastOccurredAt, projectRelationLaunchesMeta.lastOccurredAt); + return Objects.equals(this.lastOccurredAt, projectRelationLaunchesMeta.lastOccurredAt) && + Objects.equals(this.count, projectRelationLaunchesMeta.count); } @Override public int hashCode() { - return Objects.hash(lastOccurredAt); + return Objects.hash(lastOccurredAt, count); } @Override @@ -62,6 +90,7 @@ public String toString() { sb.append("class ProjectRelationLaunchesMeta {\n"); sb.append(" lastOccurredAt: ").append(toIndentedString(lastOccurredAt)).append("\n"); + sb.append(" count: ").append(toIndentedString(count)).append("\n"); sb.append("}"); return sb.toString(); } diff --git a/src/main/java/com/epam/ta/reportportal/util/OffsetUtils.java b/src/main/java/com/epam/ta/reportportal/util/OffsetUtils.java new file mode 100644 index 000000000..e8ad6e3b7 --- /dev/null +++ b/src/main/java/com/epam/ta/reportportal/util/OffsetUtils.java @@ -0,0 +1,40 @@ +package com.epam.ta.reportportal.util; + +import com.epam.ta.reportportal.model.Offset; +import com.epam.ta.reportportal.model.Offset.OrderEnum; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.domain.Sort.Order; + +public class OffsetUtils { + + private OffsetUtils() { + } + + public static T withOffsetData(T offsetObject, Page page) { + return (T) offsetObject + .offset((int) page.getPageable().getOffset()) + .limit(page.getPageable().getPageSize()) + .totalCount((int) page.getTotalElements()) + .sort(getSortFields(page.getPageable())) + .order(getOrderEnum(page.getPageable())); + } + + private static String getSortFields(Pageable pageable) { + return pageable.getSort().stream() + .map(Order::getProperty) + .reduce((s1, s2) -> s1 + ", " + s2) + .orElse(""); + } + + private static OrderEnum getOrderEnum(Pageable pageable) { + return pageable.getSort().stream() + .map(Order::getDirection) + .findFirst() + .map(direction -> direction.equals(Direction.ASC) ? OrderEnum.ASC : OrderEnum.DESC) + .orElse(OrderEnum.ASC); + } + + +} diff --git a/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepositoryTest.java b/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepositoryTest.java new file mode 100644 index 000000000..ce61c4197 --- /dev/null +++ b/src/test/java/com/epam/ta/reportportal/dao/organization/OrganizationUserRepositoryTest.java @@ -0,0 +1,58 @@ +/* + * 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.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import com.epam.ta.reportportal.BaseTest; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * @author Siarhei Hrabko + */ +class OrganizationUserRepositoryTest extends BaseTest { + + @Autowired + private OrganizationUserRepository organizationUserRepository; + + @ParameterizedTest + @CsvSource(value = { + "1|1|Member", + "2|1|Member", + }, delimiter = '|') + void organizationUser(Long userId, Long orgId, String role) { + var orgUser = organizationUserRepository.findByUserIdAndOrganization_Id(userId, orgId).get(); + assertNotNull(orgUser); + assertEquals(role, orgUser.getOrganizationRole().getRoleName()); + } + + @ParameterizedTest + @CsvSource(value = { + "1|456", + "456|1", + "456|654", + }, delimiter = '|') + void organizationUserNotFound(Long userId, Long orgId) { + var orgUserOptional = organizationUserRepository.findByUserIdAndOrganization_Id(userId, orgId); + assertTrue(orgUserOptional.isEmpty()); + } + +} diff --git a/src/test/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryTest.java b/src/test/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryTest.java new file mode 100644 index 000000000..15de0f90a --- /dev/null +++ b/src/test/java/com/epam/ta/reportportal/dao/project/OrganizationProjectRepositoryTest.java @@ -0,0 +1,54 @@ +package com.epam.ta.reportportal.dao.project; + +import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; +import static org.junit.jupiter.api.Assertions.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.commons.querygen.FilterCondition; +import com.epam.ta.reportportal.model.ProjectProfile; +import com.google.common.collect.Lists; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; + +class OrganizationProjectRepositoryTest extends BaseTest { + @Autowired + private OrganizationProjectRepository organizationProjectRepository; + + + @ParameterizedTest + @CsvSource(value = { + "1|Member", + "1|Member", + }, delimiter = '|') + void findAllOrganizationProjects(Long orgId, String role) { + Filter filter = new Filter(ProjectProfile.class, Lists.newArrayList()) + .withCondition(new FilterCondition(Condition.EQUALS, false, orgId.toString(), "organization_id")); + Pageable pageable = PageRequest.of(0, 1, Sort.by("name")); + + Page projectsListPage = organizationProjectRepository.getProjectProfileListByFilter(filter, pageable); + + assertTrue(isNotEmpty(projectsListPage.toList())); + } + + @ParameterizedTest + @CsvSource(value = { + "1|1|Member", + "2|1|Member", + }, delimiter = '|') + void findOrganizationProjectsAssignedToUser(Long userId, Long orgId, String role) { + Filter filter = new Filter(ProjectProfile.class, Lists.newArrayList()) + .withCondition(new FilterCondition(Condition.EQUALS, false, orgId.toString(), "organization_id")) + .withCondition(new FilterCondition(Condition.EQUALS, false, userId.toString(), "user_id")); + Pageable pageable = PageRequest.of(0, 10, Sort.by("name")); + + Page projectsListPage = organizationProjectRepository.getProjectProfileListByFilter(filter, pageable); + assertTrue(isNotEmpty(projectsListPage.toList())); + } +}