Skip to content
Open
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
@@ -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
)
{}
37 changes: 37 additions & 0 deletions src/main/java/com/econovation/fourth_project/Database.java
Original file line number Diff line number Diff line change
@@ -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<String, Policy> 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);
}


}
Original file line number Diff line number Diff line change
@@ -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<String> createPolicy(@RequestBody String version){
iamPolicyService.createPolicy(version);
return ResponseEntity.ok().body("성공적으로 생성");
}
}
Original file line number Diff line number Diff line change
@@ -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("성공적으로 저장~");
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.econovation.fourth_project.domain;

public record OptionalTopLevelElement(String version, String id) {

}
23 changes: 23 additions & 0 deletions src/main/java/com/econovation/fourth_project/domain/Policy.java
Original file line number Diff line number Diff line change
@@ -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<Integer, Statement> 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();
}
}
45 changes: 45 additions & 0 deletions src/main/java/com/econovation/fourth_project/domain/Statement.java
Original file line number Diff line number Diff line change
@@ -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


}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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);
}

}
Original file line number Diff line number Diff line change
@@ -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));
}


}