diff --git a/src/main/java/com/econovation/fourth_project/DTO/CreateStatementReq.java b/src/main/java/com/econovation/fourth_project/DTO/CreateStatementReq.java new file mode 100644 index 0000000..c41b945 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/DTO/CreateStatementReq.java @@ -0,0 +1,19 @@ +package com.econovation.fourth_project.DTO; + +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.NonNull; + +@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) +public record CreateStatementReq(String version, + @NonNull + String effect, + @NonNull + String principal, + String notPrincipal, + String action, + String notAction, + @NonNull + String resource + ) +{} diff --git a/src/main/java/com/econovation/fourth_project/Database.java b/src/main/java/com/econovation/fourth_project/Database.java new file mode 100644 index 0000000..2f8d431 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/Database.java @@ -0,0 +1,37 @@ +package com.econovation.fourth_project; + +import com.econovation.fourth_project.domain.Policy; +import com.econovation.fourth_project.domain.Statement; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import org.springframework.stereotype.Component; + +@Component +public final class Database { + private final Map policies = new HashMap<>(); + + public Database() { + createPolicy("2012-10-17"); + } + + //TODO: 줄일 수 있을까 + public void createPolicy(String version){ + if (policies.containsKey(version)) + throw new IllegalArgumentException(); + policies.put(version, new Policy(version)); + } + + public Policy findPolicy(String version){ + return Optional.ofNullable(policies.get(version)) + .orElseThrow(IllegalAccessError::new); + } + + public void insertStatement(String version, Statement statement){ + findPolicy(version) + .statements() + .put(statement.sid(), statement); + } + + +} diff --git a/src/main/java/com/econovation/fourth_project/controller/IamPolicyController.java b/src/main/java/com/econovation/fourth_project/controller/IamPolicyController.java new file mode 100644 index 0000000..3702a23 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/controller/IamPolicyController.java @@ -0,0 +1,20 @@ +package com.econovation.fourth_project.controller; + +import com.econovation.fourth_project.service.IamPolicyService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class IamPolicyController { + private final IamPolicyService iamPolicyService; + + @PostMapping("/policy") + public ResponseEntity createPolicy(@RequestBody String version){ + iamPolicyService.createPolicy(version); + return ResponseEntity.ok().body("성공적으로 생성"); + } +} \ No newline at end of file diff --git a/src/main/java/com/econovation/fourth_project/controller/IamStatementController.java b/src/main/java/com/econovation/fourth_project/controller/IamStatementController.java new file mode 100644 index 0000000..a13229b --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/controller/IamStatementController.java @@ -0,0 +1,22 @@ +package com.econovation.fourth_project.controller; + +import com.econovation.fourth_project.DTO.CreateStatementReq; +import com.econovation.fourth_project.service.IamStatementService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +public class IamStatementController { + private final IamStatementService iamStatementService; + + @PostMapping("/statement") + public ResponseEntity insertStatement(@RequestBody CreateStatementReq createStatementReq){ + iamStatementService.insertStatement(createStatementReq); + return ResponseEntity.ok().body("성공적으로 저장~"); + } + +} diff --git a/src/main/java/com/econovation/fourth_project/domain/OptionalTopLevelElement.java b/src/main/java/com/econovation/fourth_project/domain/OptionalTopLevelElement.java new file mode 100644 index 0000000..9328906 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/domain/OptionalTopLevelElement.java @@ -0,0 +1,5 @@ +package com.econovation.fourth_project.domain; + +public record OptionalTopLevelElement(String version, String id) { + +} diff --git a/src/main/java/com/econovation/fourth_project/domain/Policy.java b/src/main/java/com/econovation/fourth_project/domain/Policy.java new file mode 100644 index 0000000..258f45b --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/domain/Policy.java @@ -0,0 +1,23 @@ +package com.econovation.fourth_project.domain; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public record Policy(OptionalTopLevelElement optionalTopLevelElement, + Map statements){ + + public Policy(String version) { + this(new OptionalTopLevelElement(version, UUID.randomUUID().toString()), new HashMap<>()); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof Policy policy && policy.optionalTopLevelElement.version().equals(this.optionalTopLevelElement.version()); + } + + @Override + public int hashCode() { + return this.optionalTopLevelElement.version().hashCode(); + } +} diff --git a/src/main/java/com/econovation/fourth_project/domain/Statement.java b/src/main/java/com/econovation/fourth_project/domain/Statement.java new file mode 100644 index 0000000..23ec625 --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/domain/Statement.java @@ -0,0 +1,45 @@ +package com.econovation.fourth_project.domain; + +import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; +import lombok.Builder; +import lombok.NonNull; + + +public record Statement( + @NonNull + Integer sid, + String effect, + @NonNull + String principal, + String notPrincipal, + String action, + String notAction, + String resource) { + private static final AtomicInteger nextId = new AtomicInteger(0); + + @Builder + public static Statement of( + String effect, + @NonNull String principal, + String notPrincipal, + String action, + String notAction, + String resource) { + return new Statement(nextId.getAndIncrement(), effect, principal, notPrincipal, action, notAction, resource); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof Statement statement && statement.sid().equals(this.sid()); + } + + @Override + public int hashCode() { + return Objects.hash(this.sid); + } + + //원래 여기에 validate + + +} diff --git a/src/main/java/com/econovation/fourth_project/mapper/StatementMapper.java b/src/main/java/com/econovation/fourth_project/mapper/StatementMapper.java new file mode 100644 index 0000000..321d52e --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/mapper/StatementMapper.java @@ -0,0 +1,19 @@ +package com.econovation.fourth_project.mapper; + +import com.econovation.fourth_project.DTO.CreateStatementReq; +import com.econovation.fourth_project.domain.Statement; + +public final class StatementMapper { + //dto-> entity + public static Statement entityOf(CreateStatementReq createStatementReq){ + //builder? + return Statement.builder() + .effect(createStatementReq.effect()) + .action(createStatementReq.action()) + .notAction(createStatementReq.notAction()) + .principal(createStatementReq.principal()) + .notPrincipal(createStatementReq.notPrincipal()) + .resource(createStatementReq.resource()) + .build(); + } +} diff --git a/src/main/java/com/econovation/fourth_project/service/IamPolicyService.java b/src/main/java/com/econovation/fourth_project/service/IamPolicyService.java new file mode 100644 index 0000000..30d348e --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/service/IamPolicyService.java @@ -0,0 +1,15 @@ +package com.econovation.fourth_project.service; + +import com.econovation.fourth_project.Database; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class IamPolicyService { + private final Database db; + public void createPolicy(String version){ + db.createPolicy(version); + } + +} diff --git a/src/main/java/com/econovation/fourth_project/service/IamStatementService.java b/src/main/java/com/econovation/fourth_project/service/IamStatementService.java new file mode 100644 index 0000000..3375b4b --- /dev/null +++ b/src/main/java/com/econovation/fourth_project/service/IamStatementService.java @@ -0,0 +1,19 @@ +package com.econovation.fourth_project.service; + +import com.econovation.fourth_project.DTO.CreateStatementReq; +import com.econovation.fourth_project.Database; +import com.econovation.fourth_project.mapper.StatementMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class IamStatementService { + private final Database db; + public void insertStatement(CreateStatementReq createStatementReq){ + db.insertStatement(createStatementReq.version(), + StatementMapper.entityOf(createStatementReq)); + } + + +}