Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@ public GetQuotaOutput execute(GetQuotaInput input) {
.mapToLong(Content::size)
.sum();

final Long available = owner.getQuota().sizeInBytes() - actualUsedQuota;
return GetQuotaOutput.from(owner, actualUsedQuota);

return GetQuotaOutput.from(ownerId.getValue(), actualUsedQuota, owner.getQuota().sizeInBytes(), available);
}

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,16 @@
package com.callv2.drive.application.member.quota.retrieve.get;

public record GetQuotaOutput(String memberId, Long used, Long total, Long available) {
import com.callv2.drive.domain.member.Member;

public static GetQuotaOutput from(final String memberId, final Long used, final Long total, final Long available) {
return new GetQuotaOutput(memberId, used, total, available);
public record GetQuotaOutput(String memberId, String username, Long used, Long total, Long available) {

public static GetQuotaOutput from(final Member member, final Long usedQuotaInBytes) {
return new GetQuotaOutput(
member.getId().getValue(),
member.getUsername().value(),
usedQuotaInBytes,
member.getQuota().sizeInBytes(),
member.getQuota().sizeInBytes() - usedQuotaInBytes);
}

}
Original file line number Diff line number Diff line change
@@ -1,15 +1,24 @@
package com.callv2.drive.application.member.quota.retrieve.list;

import com.callv2.drive.domain.member.MemberGateway;
import com.callv2.drive.domain.pagination.Page;
import com.callv2.drive.domain.pagination.SearchQuery;

public class DefaultListQuotasUseCase extends ListQuotasUseCase {

private final MemberGateway memberGateway;

public DefaultListQuotasUseCase(final MemberGateway memberGateway) {
this.memberGateway = memberGateway;
}

@Override
public Page<QuotaListOutput> execute(SearchQuery query) {
public Page<ListQuotaOutput> execute(final SearchQuery query) {

return memberGateway
.findAll(query)
.map(ListQuotaOutput::of);

// TODO Auto-generated method stub
throw new UnsupportedOperationException("Unimplemented method 'execute'");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.callv2.drive.application.member.quota.retrieve.list;

import com.callv2.drive.domain.member.Member;

public record ListQuotaOutput(String memberId, String username, Long total) {

public static ListQuotaOutput of(final Member member) {
return new ListQuotaOutput(
member.getId().getValue(),
member.getUsername().value(),
member.getQuota().sizeInBytes());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
import com.callv2.drive.domain.pagination.Page;
import com.callv2.drive.domain.pagination.SearchQuery;

public abstract class ListQuotasUseCase extends UseCase<SearchQuery, Page<QuotaListOutput>> {
public abstract class ListQuotasUseCase extends UseCase<SearchQuery, Page<ListQuotaOutput>> {

}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ public interface MemberGateway {

Member create(Member member);

Page<Member> findAll(SearchQuery searchQuery);

Optional<Member> findById(MemberID id);

Member update(Member member);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package com.callv2.drive.infrastructure.api;

import java.util.List;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.callv2.drive.domain.pagination.Filter;
import com.callv2.drive.domain.pagination.Page;
import com.callv2.drive.domain.pagination.Pagination;
import com.callv2.drive.infrastructure.api.controller.ApiError;
import com.callv2.drive.infrastructure.member.model.MemberQuotaListResponse;
import com.callv2.drive.infrastructure.member.model.MemberQuotaResponse;
import com.callv2.drive.infrastructure.member.model.QuotaRequestListResponse;

Expand Down Expand Up @@ -49,4 +53,17 @@ ResponseEntity<Page<QuotaRequestListResponse>> listQuotaRequests(
@RequestParam(name = "orderField", required = false, defaultValue = "quotaRequestedAt") String orderField,
@RequestParam(name = "orderDirection", required = false, defaultValue = "DESC") Pagination.Order.Direction orderDirection);

@Operation(summary = "List members quotas", description = "This method list members quotas", security = @SecurityRequirement(name = "bearerAuth"))
@ApiResponse(responseCode = "200", description = "Quota members listed successfully", content = @Content(schema = @Schema(implementation = Page.class, subTypes = {
MemberQuotaListResponse.class })))
@ApiResponse(responseCode = "500", description = "Internal Server Error", content = @Content(schema = @Schema(implementation = ApiError.class)))
@GetMapping("quotas")
ResponseEntity<Page<MemberQuotaListResponse>> listQuotas(
@RequestParam(name = "page", required = false, defaultValue = "0") final int page,
@RequestParam(name = "perPage", required = false, defaultValue = "10") final int perPage,
@RequestParam(name = "orderField", required = false, defaultValue = "createdAt") String orderField,
@RequestParam(name = "orderDirection", required = false, defaultValue = "DESC") Pagination.Order.Direction orderDirection,
@RequestParam(name = "filterOperator", required = false, defaultValue = "AND") Filter.Operator filterOperator,
@RequestParam(name = "filters", required = false) List<String> filters);

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,16 @@
import com.callv2.drive.application.member.quota.request.list.ListRequestQuotaUseCase;
import com.callv2.drive.application.member.quota.retrieve.get.GetQuotaInput;
import com.callv2.drive.application.member.quota.retrieve.get.GetQuotaUseCase;
import com.callv2.drive.application.member.quota.retrieve.list.ListQuotasUseCase;
import com.callv2.drive.domain.pagination.Filter;
import com.callv2.drive.domain.pagination.Filter.Operator;
import com.callv2.drive.domain.pagination.Page;
import com.callv2.drive.domain.pagination.Pagination;
import com.callv2.drive.domain.pagination.Pagination.Order.Direction;
import com.callv2.drive.domain.pagination.SearchQuery;
import com.callv2.drive.infrastructure.api.MemberAdminAPI;
import com.callv2.drive.infrastructure.filter.adapter.QueryAdapter;
import com.callv2.drive.infrastructure.member.model.MemberQuotaListResponse;
import com.callv2.drive.infrastructure.member.model.MemberQuotaResponse;
import com.callv2.drive.infrastructure.member.model.QuotaRequestListResponse;
import com.callv2.drive.infrastructure.member.presenter.MemberPresenter;
Expand All @@ -24,14 +30,17 @@ public class MemberAdminController implements MemberAdminAPI {
private final ApproveRequestQuotaUseCase approveRequestQuotaUseCase;
private final ListRequestQuotaUseCase listRequestQuotaUseCase;
private final GetQuotaUseCase getQuotaUseCase;
private final ListQuotasUseCase listQuotasUseCase;

public MemberAdminController(
final ApproveRequestQuotaUseCase approveRequestQuotaUseCase,
final ListRequestQuotaUseCase listRequestQuotaUseCase,
final GetQuotaUseCase getQuotaUseCase) {
final GetQuotaUseCase getQuotaUseCase,
final ListQuotasUseCase listQuotasUseCase) {
this.approveRequestQuotaUseCase = approveRequestQuotaUseCase;
this.listRequestQuotaUseCase = listRequestQuotaUseCase;
this.getQuotaUseCase = getQuotaUseCase;
this.listQuotasUseCase = listQuotasUseCase;
}

@Override
Expand Down Expand Up @@ -61,4 +70,28 @@ public ResponseEntity<Page<QuotaRequestListResponse>> listQuotaRequests(

}

@Override
public ResponseEntity<Page<MemberQuotaListResponse>> listQuotas(
int page,
int perPage,
String orderField,
Direction orderDirection,
Operator filterOperator,
List<String> filters) {

final List<Filter> searchFilters = filters == null ? List.of()
: filters
.stream()
.map(QueryAdapter::of)
.toList();

final SearchQuery query = SearchQuery.of(
Pagination.of(page, perPage, Pagination.Order.of(orderField, orderDirection)),
filterOperator,
searchFilters);

return ResponseEntity.ok(listQuotasUseCase.execute(query).map(MemberPresenter::present));

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@
import com.callv2.drive.application.member.quota.request.list.ListRequestQuotaUseCase;
import com.callv2.drive.application.member.quota.retrieve.get.DefaultGetQuotaUseCase;
import com.callv2.drive.application.member.quota.retrieve.get.GetQuotaUseCase;
import com.callv2.drive.application.member.quota.retrieve.list.DefaultListQuotasUseCase;
import com.callv2.drive.application.member.quota.retrieve.list.ListQuotasUseCase;
import com.callv2.drive.application.member.synchronize.DefaultSynchronizeMemberUseCase;
import com.callv2.drive.application.member.synchronize.SynchronizeMemberUseCase;
import com.callv2.drive.domain.file.FileGateway;
Expand Down Expand Up @@ -52,4 +54,9 @@ SynchronizeMemberUseCase synchronizeMemberUseCase() {
return new DefaultSynchronizeMemberUseCase(memberGateway);
}

@Bean
ListQuotasUseCase listQuotasUseCase() {
return new DefaultListQuotasUseCase(memberGateway);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public <T> Specification<T> buildSpecification(Filter filter) {
validateFilter(filter);

return (root, query, criteriaBuilder) -> criteriaBuilder
.like(root.get(filter.field()), "%" + filter.value() + "%");
.like(criteriaBuilder.upper(root.get(filter.field())), "%" + filter.value().toUpperCase() + "%");
}

private void validateFilter(final Filter filter) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import java.util.Optional;

import org.springframework.dao.OptimisticLockingFailureException;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -14,16 +16,21 @@
import com.callv2.drive.domain.member.QuotaRequestPreview;
import com.callv2.drive.domain.pagination.Page;
import com.callv2.drive.domain.pagination.SearchQuery;
import com.callv2.drive.infrastructure.filter.FilterService;
import com.callv2.drive.infrastructure.filter.adapter.QueryAdapter;
import com.callv2.drive.infrastructure.member.persistence.MemberJpaEntity;
import com.callv2.drive.infrastructure.member.persistence.MemberJpaRepository;

@Component
public class DefaultMemberGateway implements MemberGateway {

private final FilterService filterService;
private final MemberJpaRepository memberJpaRepository;

public DefaultMemberGateway(final MemberJpaRepository memberJpaRepository) {
public DefaultMemberGateway(
final FilterService filterService,
final MemberJpaRepository memberJpaRepository) {
this.filterService = filterService;
this.memberJpaRepository = memberJpaRepository;
}

Expand All @@ -35,6 +42,28 @@ public Member create(final Member member) {
return this.memberJpaRepository.save(MemberJpaEntity.fromDomain(member)).toDomain();
}

@Override
public Page<Member> findAll(SearchQuery searchQuery) {

final PageRequest pageRequest = QueryAdapter.of(searchQuery.pagination());

final Specification<MemberJpaEntity> specification = filterService.buildSpecification(
MemberJpaEntity.class,
searchQuery.filterMethod(),
searchQuery.filters());

final var pageResult = this.memberJpaRepository.findAll(specification, pageRequest);

return new Page<>(
pageResult.getNumber(),
pageResult.getSize(),
pageResult.getTotalPages(),
pageResult.getTotalElements(),
pageResult.toList())
.map(MemberJpaEntity::toDomain);

}

@Override
public Optional<Member> findById(final MemberID id) {
return this.memberJpaRepository
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.callv2.drive.infrastructure.member.model;

public record MemberQuotaListResponse(String memberId, String username, Long total) {

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.callv2.drive.infrastructure.member.model;

public record MemberQuotaResponse(String memberId, Long used, Long total, Long available) {
public record MemberQuotaResponse(String memberId, String username, Long used, Long total, Long available) {

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
Expand All @@ -14,6 +15,8 @@

public interface MemberJpaRepository extends JpaRepository<MemberJpaEntity, String> {

Page<MemberJpaEntity> findAll(Specification<MemberJpaEntity> whereClause, Pageable page);

@Query("""
select distinct new com.callv2.drive.domain.member.QuotaRequestPreview(
m.id as memberId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.callv2.drive.application.member.quota.request.list.ListRequestQuotaOutput;
import com.callv2.drive.application.member.quota.retrieve.get.GetQuotaOutput;
import com.callv2.drive.application.member.quota.retrieve.list.ListQuotaOutput;
import com.callv2.drive.infrastructure.member.model.MemberQuotaListResponse;
import com.callv2.drive.infrastructure.member.model.MemberQuotaResponse;
import com.callv2.drive.infrastructure.member.model.QuotaRequestListResponse;

Expand All @@ -18,7 +20,19 @@ static QuotaRequestListResponse present(final ListRequestQuotaOutput output) {
}

static MemberQuotaResponse present(final GetQuotaOutput output) {
return new MemberQuotaResponse(output.memberId(), output.used(), output.total(), output.available());
return new MemberQuotaResponse(
output.memberId(),
output.username(),
output.used(),
output.total(),
output.available());
}

static MemberQuotaListResponse present(final ListQuotaOutput output) {
return new MemberQuotaListResponse(
output.memberId(),
output.username(),
output.total());
}

}