diff --git a/build.gradle b/build.gradle index 553af71..65d9109 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,8 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' // hibernate snowflake implementation 'org.hibernate:hibernate-core:5.6.4.Final' + implementation group: 'io.vavr', name: 'vavr', version: '0.10.4' + } tasks.named('test') { diff --git a/src/main/java/com/econovation/fourth_project/policy/common/AutoIncrement.java b/src/main/java/com/econovation/fourth_project/policy/common/AutoIncrement.java new file mode 100644 index 0000000..bd2d8ad --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/common/AutoIncrement.java @@ -0,0 +1,14 @@ +package com.econovation.fourth_project.policy.common; + +import org.springframework.stereotype.Component; + +import java.util.concurrent.atomic.AtomicLong; + +@Component +public class AutoIncrement { + private AtomicLong id = new AtomicLong(1); + + public Long autoIncrement() { + return id.getAndIncrement(); + } +} diff --git a/src/main/java/com/econovation/fourth_project/policy/common/HttpMethod.java b/src/main/java/com/econovation/fourth_project/policy/common/HttpMethod.java new file mode 100644 index 0000000..7dc70cb --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/common/HttpMethod.java @@ -0,0 +1,9 @@ +package com.econovation.fourth_project.policy.common; + +// HttpMethod GET,PUT,POST,DELETE만 허용 +public enum HttpMethod { + GET, + PUT, + POST, + DELETE +} diff --git a/src/main/java/com/econovation/fourth_project/policy/common/StaticMessage.java b/src/main/java/com/econovation/fourth_project/policy/common/StaticMessage.java new file mode 100644 index 0000000..4e05bc2 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/common/StaticMessage.java @@ -0,0 +1,5 @@ +package com.econovation.fourth_project.policy.common; + +public class StaticMessage { + public static String SUCCESS_CREATE_POLICY = "정책을 생성하였습니다."; +} diff --git a/src/main/java/com/econovation/fourth_project/policy/controller/PolicyController.java b/src/main/java/com/econovation/fourth_project/policy/controller/PolicyController.java new file mode 100644 index 0000000..834358f --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/controller/PolicyController.java @@ -0,0 +1,28 @@ +package com.econovation.fourth_project.policy.controller; + +import com.econovation.fourth_project.policy.common.StaticMessage; +import com.econovation.fourth_project.policy.dto.request.CheckResourceRequest; +import com.econovation.fourth_project.policy.dto.request.CreatePolicyRequest; +import com.econovation.fourth_project.policy.servicce.CreatePolicyUseCase; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api") +public class PolicyController { + private final CreatePolicyUseCase createPolicyUseCase; + + @PostMapping("/policy") + public ResponseEntity createPolicy(@RequestBody CreatePolicyRequest request) { + createPolicyUseCase.execute(request); + return ResponseEntity.ok(StaticMessage.SUCCESS_CREATE_POLICY); + } + + @GetMapping("/check/resource/{resource}") + public ResponseEntity checkResource(@RequestBody CheckResourceRequest request, @PathVariable String resource) { + + } + +} diff --git a/src/main/java/com/econovation/fourth_project/policy/database/Database.java b/src/main/java/com/econovation/fourth_project/policy/database/Database.java new file mode 100644 index 0000000..8b7fd23 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/database/Database.java @@ -0,0 +1,29 @@ +package com.econovation.fourth_project.policy.database; + +import com.econovation.fourth_project.policy.common.AutoIncrement; +import com.econovation.fourth_project.policy.domain.Policy; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +@Component +@RequiredArgsConstructor +public class Database { + private final AutoIncrement autoIncrement; + private Map policyTb = new ConcurrentHashMap<>(); + + public Policy savePolicy(Policy policy) { + Long id = autoIncrement.autoIncrement(); + policyTb.put(id,policy); + policy.setId(id); + return policy; + } + + public List findByResource(String resource) { + return policyTb.values().stream() + .filter(policy -> policy.getStatement().getResource().split(":").(resource)) + .toList(); + } +} diff --git a/src/main/java/com/econovation/fourth_project/policy/domain/Effect.java b/src/main/java/com/econovation/fourth_project/policy/domain/Effect.java new file mode 100644 index 0000000..d676f1a --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/domain/Effect.java @@ -0,0 +1,6 @@ +package com.econovation.fourth_project.policy.domain; + +public enum Effect { + Allow, + Deny +} diff --git a/src/main/java/com/econovation/fourth_project/policy/domain/Policy.java b/src/main/java/com/econovation/fourth_project/policy/domain/Policy.java new file mode 100644 index 0000000..2dbcb39 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/domain/Policy.java @@ -0,0 +1,24 @@ +package com.econovation.fourth_project.policy.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; +@Getter +@Setter +public class Policy { + private Long id; + private LocalDate version; + private Statement statement; + + public static Policy createPolicy(LocalDate version, Statement statement){ + return new Policy(version,statement); + } + + public Policy(LocalDate version, Statement statement) { + this.version = version; + this.statement = statement; + } +} diff --git a/src/main/java/com/econovation/fourth_project/policy/domain/Statement.java b/src/main/java/com/econovation/fourth_project/policy/domain/Statement.java new file mode 100644 index 0000000..079a32b --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/domain/Statement.java @@ -0,0 +1,13 @@ +package com.econovation.fourth_project.policy.domain; + +import lombok.Getter; + +import java.util.Map; +@Getter +public class Statement { + private String sid; + private Effect effect; + private Map action; + private Map notAction; + private String Resource; +} diff --git a/src/main/java/com/econovation/fourth_project/policy/dto/request/CheckResourceRequest.java b/src/main/java/com/econovation/fourth_project/policy/dto/request/CheckResourceRequest.java new file mode 100644 index 0000000..830b886 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/dto/request/CheckResourceRequest.java @@ -0,0 +1,4 @@ +package com.econovation.fourth_project.policy.dto.request; + +public record CheckResourceRequest(String httpMethod) { +} diff --git a/src/main/java/com/econovation/fourth_project/policy/dto/request/CreatePolicyRequest.java b/src/main/java/com/econovation/fourth_project/policy/dto/request/CreatePolicyRequest.java new file mode 100644 index 0000000..82c797e --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/dto/request/CreatePolicyRequest.java @@ -0,0 +1,10 @@ +package com.econovation.fourth_project.policy.dto.request; + +import com.econovation.fourth_project.policy.domain.Statement; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Getter; + +import java.time.LocalDate; +public record CreatePolicyRequest(@JsonFormat(pattern = "yyyy-MM-dd") LocalDate version, Statement statement) { + +} diff --git a/src/main/java/com/econovation/fourth_project/policy/servicce/CheckResourceUseCase.java b/src/main/java/com/econovation/fourth_project/policy/servicce/CheckResourceUseCase.java new file mode 100644 index 0000000..2776bb5 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/servicce/CheckResourceUseCase.java @@ -0,0 +1,44 @@ +package com.econovation.fourth_project.policy.servicce; + +import com.econovation.fourth_project.policy.database.Database; +import com.econovation.fourth_project.policy.domain.Effect; +import com.econovation.fourth_project.policy.domain.Policy; +import com.econovation.fourth_project.policy.dto.request.CheckResourceRequest; +import io.vavr.control.Either; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.groupingBy; + +@Component +@RequiredArgsConstructor +public class CheckResourceUseCase { + private final Database database; + + public Boolean execute(CheckResourceRequest request, String resource) { + Either policy = findByResource(resource); + policy.fold( + + ) + } + + /** + * Either + */ + private Either findByResource(String resource) { + List policies = database.findByResource(resource); + Map> groupByEffect = policies.stream().collect(groupingBy(policy -> policy.getStatement().getEffect())); + if(groupByEffect.containsKey(Effect.Deny)) + // stream.findFirst나 findAny보다 그냥 0번째 인덱스 가져 오는게 더 성능상 좋을 것 같다. + return Either.left(groupByEffect.get(Effect.Deny).get(0)); + else + return Either.right(groupByEffect.get(Effect.Allow).get(0)); + } + // Effect가 Deny인 경우 + private boolean checkAction() + + +} diff --git a/src/main/java/com/econovation/fourth_project/policy/servicce/CreatePolicyUseCase.java b/src/main/java/com/econovation/fourth_project/policy/servicce/CreatePolicyUseCase.java new file mode 100644 index 0000000..ce75a18 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/policy/servicce/CreatePolicyUseCase.java @@ -0,0 +1,18 @@ +package com.econovation.fourth_project.policy.servicce; + +import com.econovation.fourth_project.policy.database.Database; +import com.econovation.fourth_project.policy.domain.Policy; +import com.econovation.fourth_project.policy.dto.request.CreatePolicyRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class CreatePolicyUseCase { + private final Database database; + + public void execute(CreatePolicyRequest request) { + Policy policy = Policy.createPolicy(request.version(), request.statement()); + database.savePolicy(policy); + } +}