Skip to content

Commit

Permalink
#1 - Feat: Add Privacy Classes
Browse files Browse the repository at this point in the history
  • Loading branch information
umtuk committed Jul 15, 2023
1 parent f7b8b52 commit 88ec9c1
Show file tree
Hide file tree
Showing 15 changed files with 410 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.data;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import java.time.LocalDateTime;
import java.util.Set;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.routemaster.api.auth.domain.user.info.privacy.impl.util.constant.PrivacyType;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection = "privacy_group")
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Getter
@ToString
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class PrivacyGroup {

@Id
private String id;
@Field(name = "name")
private String name;
@Field(name = "description")
private String description;
@Field(name = "privacy_ids")
private Set<String> privacyIds;
@Field(name = "type")
private PrivacyType type;
@Field(name = "priority")
private Long priority;
@Field(name = "created_at")
private LocalDateTime createdAt;
@Field(name = "updated_at")
private LocalDateTime updatedAt;
@Field(name = "expire_days")
private Long expireDays;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.exception;

public class PrivacyErrorDescription {

public static final String PRIVACY_NOT_FOUND = "Privacy Not Found.";
public static final String PRIVACY_GROUP_NOT_FOUND = "Privacy Group Not Found.";
public static final String USER_PRIVACY_NOT_FOUND = "User Privacy Not Found.";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.persistence;

import java.util.List;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;
import org.routemaster.api.auth.domain.user.info.privacy.impl.util.constant.PrivacyType;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface PrivacyGroupRepository extends MongoRepository<PrivacyGroup, String> {

List<PrivacyGroup> findAllByTypeIn(Iterable<PrivacyType> types);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.persistence;

import java.util.List;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;
import org.routemaster.api.auth.domain.user.info.privacy.impl.util.constant.PrivacyType;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface PrivacyRepository extends MongoRepository<Privacy, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.service;

import java.util.List;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;

public interface PrivacyGroupService {

PrivacyGroup details(String id);
List<PrivacyGroup> currentPrivacyGroups();
PrivacyGroup save(PrivacyGroup privacyGroup);
List<PrivacyGroup> saveAll(Iterable<PrivacyGroup> privacyGroups);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.service;

import java.util.List;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;

public interface PrivacyService {
List<Privacy> list(Iterable<String> ids);
List<Privacy> saveAll(List<Privacy> privacies);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.service.impl;

import java.util.Arrays;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.routemaster.api.auth.domain.user.info.impl.exception.InfoErrorCode;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;
import org.routemaster.api.auth.domain.user.info.privacy.impl.exception.PrivacyErrorDescription;
import org.routemaster.api.auth.domain.user.info.privacy.impl.persistence.PrivacyGroupRepository;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyGroupService;
import org.routemaster.api.auth.domain.user.info.privacy.impl.util.constant.PrivacyType;
import org.routemaster.sdk.exception.data.roe.ROEFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class DefaultPrivacyGroupService implements PrivacyGroupService {

private final PrivacyGroupRepository privacyGroupRepository;
private final ROEFactory roeFactory;

@Override
public PrivacyGroup details(String id) {
return privacyGroupRepository.findById(id)
.orElseThrow(() -> roeFactory.get(
InfoErrorCode.ROE_111,
PrivacyErrorDescription.PRIVACY_GROUP_NOT_FOUND,
HttpStatus.NOT_FOUND
));
}

@Override
public List<PrivacyGroup> currentPrivacyGroups() {
return privacyGroupRepository.findAllByTypeIn(Arrays.asList(
PrivacyType.INDEX,
PrivacyType.REQUIRED,
PrivacyType.OPTIONAL
));
}

@Override
public PrivacyGroup save(PrivacyGroup privacyGroup) {
return privacyGroupRepository.save(privacyGroup);
}

@Override
public List<PrivacyGroup> saveAll(Iterable<PrivacyGroup> privacyGroups) {
return privacyGroupRepository.saveAll(privacyGroups);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.service.impl;

import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;
import org.routemaster.api.auth.domain.user.info.privacy.impl.persistence.PrivacyRepository;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyService;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class DefaultPrivacyService implements PrivacyService {

private final PrivacyRepository privacyRepository;

@Override
public List<Privacy> list(Iterable<String> ids) {
return privacyRepository.findAllById(ids);
}

@Override
public List<Privacy> saveAll(List<Privacy> privacies) {
for (Privacy p : privacies) p.setCreatedAt();
return privacyRepository.saveAll(privacies);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.routemaster.api.auth.domain.user.info.privacy.impl.util.constant;

public enum PrivacyType {

INDEX,
REQUIRED,
OPTIONAL,
DEPRECATED,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package org.routemaster.api.auth.endpoint.privacy.impl.controller;

import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyGroupService;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyService;
import org.routemaster.api.auth.endpoint.privacy.impl.service.PrivacyEndpointService;
import org.routemaster.api.auth.endpoint.privacy.impl.vo.response.PrivacyGroupListResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.parameters.P;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/privacy")
@RequiredArgsConstructor
public class PrivacyRestController {

private final PrivacyEndpointService privacyEndpointService;
private final PrivacyService privacyService;
private final PrivacyGroupService privacyGroupService;

@GetMapping("/all")
@PreAuthorize("permitAll()")
public ResponseEntity<PrivacyGroupListResponse> list() {
PrivacyGroupListResponse response = privacyEndpointService.all();

if (response.isEmpty()) {
return new ResponseEntity<>(response, HttpStatus.NO_CONTENT);
}
return new ResponseEntity<>(response, HttpStatus.OK);
}

@PostMapping("/all")
@PreAuthorize("permitAll()")
public ResponseEntity<List<Privacy>> saveAll(@RequestBody List<Privacy> privacies) {
List<Privacy> response = privacyService.saveAll(privacies);
return new ResponseEntity<>(response, HttpStatus.OK);
}

@PostMapping("/group")
@PreAuthorize("permitAll()")
public ResponseEntity<PrivacyGroup> saveGroup(@RequestBody PrivacyGroup privacyGroup) {
PrivacyGroup response = privacyGroupService.save(privacyGroup);
return new ResponseEntity<>(response, HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.routemaster.api.auth.endpoint.privacy.impl.service;

import org.routemaster.api.auth.endpoint.privacy.impl.vo.response.PrivacyGroupListResponse;

public interface PrivacyEndpointService {

PrivacyGroupListResponse all();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package org.routemaster.api.auth.endpoint.privacy.impl.service.impl;

import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.routemaster.api.auth.domain.user.info.impl.exception.InfoErrorCode;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;
import org.routemaster.api.auth.domain.user.info.privacy.impl.exception.PrivacyErrorDescription;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyGroupService;
import org.routemaster.api.auth.domain.user.info.privacy.impl.service.PrivacyService;
import org.routemaster.api.auth.endpoint.privacy.impl.service.PrivacyEndpointService;
import org.routemaster.api.auth.endpoint.privacy.impl.util.mapper.PrivacyGroupVOMapper;
import org.routemaster.api.auth.endpoint.privacy.impl.vo.response.PrivacyGroupListResponse;
import org.routemaster.sdk.exception.data.roe.ROEFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;

@Slf4j
@Service
@RequiredArgsConstructor
public class DefaultPrivacyEndpointService implements PrivacyEndpointService {

private final PrivacyService privacyService;
private final PrivacyGroupService privacyGroupService;
private final PrivacyGroupVOMapper privacyGroupVOMapper;

private final ROEFactory roeFactory;

@Override
public PrivacyGroupListResponse all() {
List<PrivacyGroup> privacyGroups = privacyGroupService.currentPrivacyGroups();

Set<String> privacyIds = new HashSet<>();
for (PrivacyGroup privacyGroup : privacyGroups) {
privacyIds.addAll(privacyGroup.getPrivacyIds());
}

List<Privacy> privacies = privacyService.list(privacyIds);
if (privacyIds.size() != privacies.size()) {
roeFactory.get(
InfoErrorCode.ROE_111,
PrivacyErrorDescription.PRIVACY_NOT_FOUND,
HttpStatus.NOT_FOUND
);
}
Map<String, Privacy> privacyMap = new HashMap<>();
for (Privacy privacy : privacies) {
privacyMap.put(privacy.getId(), privacy);
}

return privacyGroupVOMapper.listResponse(privacyGroups, privacyMap);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.routemaster.api.auth.endpoint.privacy.impl.util.mapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.Privacy;
import org.routemaster.api.auth.domain.user.info.privacy.impl.data.PrivacyGroup;
import org.routemaster.api.auth.endpoint.privacy.impl.vo.response.PrivacyGroupResponse;
import org.routemaster.api.auth.endpoint.privacy.impl.vo.response.PrivacyGroupListResponse;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class PrivacyGroupVOMapper {

public PrivacyGroupResponse response(PrivacyGroup privacyGroup, Map<String, Privacy> privacyMap) {
return PrivacyGroupResponse.builder()
.id(privacyGroup.getId())
.name(privacyGroup.getName())
.description(privacyGroup.getDescription())
.privacies(privaciesOrderByPriorities(privacyGroup.getPrivacyIds(), privacyMap))
.type(privacyGroup.getType())
.createdAt(privacyGroup.getCreatedAt())
.updatedAt(privacyGroup.getUpdatedAt())
.expiresDays(privacyGroup.getExpireDays())
.priority(privacyGroup.getPriority())
.build();
}

public PrivacyGroupListResponse listResponse(List<PrivacyGroup> privacyGroups,
Map<String, Privacy> privacyMap) {
List<PrivacyGroupResponse> responses = new ArrayList<>();
for (PrivacyGroup privacyGroup : privacyGroups) {
responses.add(response(privacyGroup, privacyMap));
}
responses.sort((p1, p2) -> p1.getPriority().compareTo(p2.getPriority()));
return PrivacyGroupListResponse.builder()
.privacyGroups(responses)
.build();
}

private List<Privacy> privaciesOrderByPriorities(Iterable<String> privacyIds,
Map<String, Privacy> privacyMap) {
List<Privacy> privacies = new ArrayList<>();
for (String privacyId : privacyIds) {
privacies.add(privacyMap.get(privacyId));
}
privacies.sort((p1, p2) -> p1.getPriority().compareTo(p2.getPriority()));
return privacies;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.routemaster.api.auth.endpoint.privacy.impl.vo.response;

import java.util.List;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Getter
public class PrivacyGroupListResponse {

private List<PrivacyGroupResponse> privacyGroups;
public boolean isEmpty() {
return privacyGroups.isEmpty();
}
}
Loading

0 comments on commit 88ec9c1

Please sign in to comment.