Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
9e82326
refactor/OPS-360 : OpenAPI 애너테이션 추가
yonggi1234 Sep 30, 2025
65bbf07
refactor/OPS-360 : NoResultException 예외 분리
yonggi1234 Sep 30, 2025
6323136
refactor/OPS-360 : param 추가
yonggi1234 Sep 30, 2025
3c4242a
refactor/OPS-360 : param 추가
yonggi1234 Sep 30, 2025
23ff02e
Merge remote-tracking branch 'origin/develop' into OPS-360-BE-refacto…
yonggi1234 Sep 30, 2025
a45462c
refactor/OPS-360 : default 폴더 CRUD 로직 수정
yonggi1234 Sep 30, 2025
96f9cc0
refactor/OPS-360 : 폴더 리스트는 호출 로직 수정
yonggi1234 Sep 30, 2025
1ffad1c
refactor/OPS-346 : 공유 폴더 관리
yonggi1234 Sep 30, 2025
21994af
feat/OPS-365 : soft delete + 휴지통 조회 구현
yonggi1234 Sep 30, 2025
1693014
Merge remote-tracking branch 'origin/OPS-365-BE-feat-soft-delete-구현' …
yonggi1234 Sep 30, 2025
3f9d175
feat/OPS-346 : 공유 폴더 관리
yonggi1234 Sep 30, 2025
8e54494
feat/OPS-346 : 공유 폴더 관리
yonggi1234 Sep 30, 2025
3cda410
feat/OPS-246 : 공유 파일 관리
yonggi1234 Oct 1, 2025
54e2810
Merge remote-tracking branch 'origin/develop' into OPS-346-BE-feat-공유…
yonggi1234 Oct 1, 2025
f94eb9e
refactor/OPS-346 : 개인 / 공유 폳더 관리 분리
yonggi1234 Oct 1, 2025
95c057d
Merge remote-tracking branch 'origin/OPS-346-BE-feat-공유-폴더-관리' into O…
yonggi1234 Oct 1, 2025
0beddbd
refactor/OPS-346 : 개인 / 공유 파일 관리 분리
yonggi1234 Oct 2, 2025
1568ea0
Merge remote-tracking branch 'origin/develop' into OPS-346-BE-feat-공유…
yonggi1234 Oct 2, 2025
fc1939b
refactor/OPS-346 : 검색 기능 출처 누락 수정
yonggi1234 Oct 2, 2025
51ea730
Merge branch 'refs/heads/OPS-346-BE-feat-공유-폴더-관리' into OPS-246-BE-fe…
yonggi1234 Oct 2, 2025
1496f7b
feat/OPS-246 : 개인 / 공유 파일 관리 분리
yonggi1234 Oct 3, 2025
4d09007
feat/OPS-246 : 개인 / 공유 파일 관리 분리
yonggi1234 Oct 3, 2025
6ada0a9
feat/OPS-246 : api 요청 수정
yonggi1234 Oct 3, 2025
31d4944
feat/OPS-246 : api 요청 수정 - request 이름 통일
yonggi1234 Oct 3, 2025
ba0ba12
refactor/OPS-246 : 머지
yonggi1234 Oct 3, 2025
4d767b6
refactor/OPS-246 : 머지
yonggi1234 Oct 3, 2025
8cf950e
refactor/OPS-246 : 머지
yonggi1234 Oct 3, 2025
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
1 change: 0 additions & 1 deletion .github/workflows/prod-server.yml
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ jobs:
-p $NEW_PORT:8080 \
--name $NEW_CONTAINER \
--network common \
-e SPRING_PROFILES_ACTIVE=prod \
-e SPRING_DATASOURCE_URL="${{secrets.PROD_DB_URL}}" \
-e SPRING_DATASOURCE_USERNAME="${{secrets.PROD_DB_USERNAME}}" \
-e SPRING_DATASOURCE_PASSWORD="${{secrets.PROD_DB_PASSWORD}}" \
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/test-server-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ jobs:
-p $NEW_PORT:8080 \
--name $NEW_CONTAINER \
--network common \
-e SPRING_PROFILES_ACTIVE=server \
-e SPRING_DATASOURCE_URL="${{secrets.TEST_DB_URL}}" \
-e SPRING_DATASOURCE_USERNAME="${{secrets.TEST_DB_USERNAME}}" \
-e SPRING_DATASOURCE_PASSWORD="${{secrets.TEST_DB_PASSWORD}}" \
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-server-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ jobs:
- name: Generate application-secrets.yml
run: |
mkdir -p src/main/resources
echo "${{ secrets.APPLICATION_SECRET_YML_V2 }}" > src/main/resources/application-secrets.yml
echo "${{ secrets.APPLICATION_SECRET_YML }}" > src/main/resources/application-secrets.yml
echo "OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}" >> src/main/resources/application-secrets.yml

echo "spring.cloud.aws.region.static: ${{ secrets.AWS_REGION }}" >> src/main/resources/application-secrets.yml
Expand Down
4 changes: 0 additions & 4 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,6 @@ dependencies {

// Awaitility (비동기 테스트 지원)
testImplementation 'org.awaitility:awaitility:4.2.0'

// retry (ai retry용)
implementation 'org.springframework.retry:spring-retry'
implementation 'org.springframework:spring-aspects'
}

dependencyManagement {
Expand Down
Empty file modified gradlew
100755 → 100644
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,8 @@ public class OAuth2SuccessHandler extends SimpleUrlAuthenticationSuccessHandler
@Value("${front.redirect_domain}")
private String redirect_domain;

private final String SITE_DOMAIN = "zoopzoop.kro.kr";
@Value("${spring.profiles.active:dev}")
private String activeProfile;

@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Expand Down Expand Up @@ -111,7 +112,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
.maxAge(jwtProperties.getAccessTokenValidity() / 1000)
// .domain() // 프론트엔드 & 백엔드 상위 도메인
// .secure(true) // https 필수 설정.
.domain(SITE_DOMAIN)
.domain(redirect_domain)
.secure(true)
.sameSite("None")
.build();
Expand All @@ -120,7 +121,7 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
.httpOnly(true)
.path("/")
.maxAge(jwtProperties.getRefreshTokenValidity() / 1000) // RefreshToken 유효기간과 동일하게
.domain(SITE_DOMAIN)
.domain(redirect_domain)
.secure(true)
.sameSite("None")
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ public ResponseEntity<RsData<BodyForReactFlow>> getGraph(
"ID: " + dashboardId + " 의 React-flow 데이터를 조회했습니다.",
BodyForReactFlow.from(graph)
));
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,42 +19,27 @@ public record BodyForReactFlow(
public record NodeDto(
@JsonProperty("id") String nodeKey,
@JsonProperty("type") String nodeType,
@JsonProperty("selected") Boolean selected,
@JsonProperty("dragging") Boolean dragging,
@JsonProperty("position") PositionDto positionDto,
@JsonProperty("measured") MeasurementsDto measurements,
@JsonProperty("data") DataDto data
Map<String, String> data,
@JsonProperty("position") PositionDto positionDto
) {
public record PositionDto(
@JsonProperty("x") double x,
@JsonProperty("y") double y
) {}

public record MeasurementsDto(
@JsonProperty("width") double width,
@JsonProperty("height") double height
) {}

public record DataDto(
@JsonProperty("content") String content,
@JsonProperty("createdAt") String createAt, // YYYY-MM-DD format
@JsonProperty("link") String sourceUrl,
@JsonProperty("title") String title,
@JsonProperty("user") WriterDto writer
) {}

public record WriterDto(
@JsonProperty("name") String name,
@JsonProperty("profileUrl") String profileImageUrl
) {}

) {}
}

public record EdgeDto(
@JsonProperty("id") String edgeKey,
@JsonProperty("source") String sourceNodeKey,
@JsonProperty("target") String targetNodeKey
@JsonProperty("target") String targetNodeKey,
@JsonProperty("type") String edgeType,
@JsonProperty("animated") boolean isAnimated,
@JsonProperty("style") StyleDto styleDto
) {
public record StyleDto(
String stroke,
Double strokeWidth
) {}
}

// DTO -> Entity, BodyForReactFlow를 Graph 엔티티로 변환
Expand All @@ -66,24 +51,10 @@ public Graph toEntity() {
Node node = new Node();
node.setNodeKey(dto.nodeKey());
node.setNodeType(NodeType.valueOf(dto.nodeType().toUpperCase()));
node.setSelected(dto.selected() != null ? dto.selected() : false);
node.setDragging(dto.dragging() != null ? dto.dragging() : false);
node.setPositionX(dto.positionDto().x());
node.setPositionY(dto.positionDto().y());
if (dto.measurements() != null) {
node.setWidth(dto.measurements().width());
node.setHeight(dto.measurements().height());
}
if (dto.data() != null) {
node.setData(Map.of(
"content", dto.data().content(),
"createdAt", dto.data().createAt(),
"sourceUrl", dto.data().sourceUrl(),
"title", dto.data().title(),
"writerName", dto.data().writer() != null ? dto.data().writer().name() : null,
"writerProfileImageUrl", dto.data().writer() != null ? dto.data().writer().profileImageUrl() : null
));
}
node.setData(dto.data());
node.setPositonX(dto.positionDto().x());
node.setPositonY(dto.positionDto().y());
node.setGraph(graph); // 연관관계 설정
return node;
})
.toList();
Expand All @@ -94,6 +65,12 @@ public Graph toEntity() {
edge.setEdgeKey(dto.edgeKey());
edge.setSourceNodeKey(dto.sourceNodeKey());
edge.setTargetNodeKey(dto.targetNodeKey());
edge.setEdgeType(EdgeType.valueOf(dto.edgeType().toUpperCase()));
edge.setAnimated(dto.isAnimated());
if (dto.styleDto() != null) {
edge.setStroke(dto.styleDto().stroke());
edge.setStrokeWidth(dto.styleDto().strokeWidth());
}
edge.setGraph(graph); // 연관관계 설정
return edge;
})
Expand All @@ -111,28 +88,19 @@ public static BodyForReactFlow from(Graph graph) {
.map(n -> new NodeDto(
n.getNodeKey(),
n.getNodeType().name().toUpperCase(),
n.isSelected(),
n.isDragging(),
new NodeDto.PositionDto(n.getPositionX(), n.getPositionY()),
new NodeDto.MeasurementsDto(n.getWidth(), n.getHeight()),
new NodeDto.DataDto(
n.getData().get("content"),
n.getData().get("createdAt"),
n.getData().get("sourceUrl"),
n.getData().get("title"),
new NodeDto.WriterDto(
n.getData().get("writerName"),
n.getData().get("writerProfileImageUrl")
)
)
n.getData(),
new NodeDto.PositionDto(n.getPositonX(), n.getPositonY())
))
.toList();

List<EdgeDto> edgeDtos = graph.getEdges().stream()
.map(e -> new EdgeDto(
e.getEdgeKey(),
e.getSourceNodeKey(),
e.getTargetNodeKey()
e.getTargetNodeKey(),
e.getEdgeType().name().toUpperCase(),
e.isAnimated(),
new EdgeDto.StyleDto(e.getStroke(), e.getStrokeWidth())
))
.toList();

Expand All @@ -145,22 +113,9 @@ public List<Node> toNodeEntities(Graph graph) {
Node node = new Node();
node.setNodeKey(dto.nodeKey());
node.setNodeType(NodeType.valueOf(dto.nodeType().toUpperCase()));
node.setPositionX(dto.positionDto().x());
node.setPositionY(dto.positionDto().y());
if (dto.measurements() != null) {
node.setWidth(dto.measurements().width());
node.setHeight(dto.measurements().height());
}
if (dto.data() != null) {
node.setData(Map.of(
"content", dto.data().content(),
"createdAt", dto.data().createAt(),
"sourceUrl", dto.data().sourceUrl(),
"title", dto.data().title(),
"writerName", dto.data().writer() != null ? dto.data().writer().name() : null,
"writerProfileImageUrl", dto.data().writer() != null ? dto.data().writer().profileImageUrl() : null
));
}
node.setData(dto.data());
node.setPositonX(dto.positionDto().x());
node.setPositonY(dto.positionDto().y());
node.setGraph(graph); // 연관관계 설정
return node;
})
Expand All @@ -174,6 +129,12 @@ public List<Edge> toEdgeEntities(Graph graph) {
edge.setEdgeKey(dto.edgeKey());
edge.setSourceNodeKey(dto.sourceNodeKey());
edge.setTargetNodeKey(dto.targetNodeKey());
edge.setEdgeType(EdgeType.valueOf(dto.edgeType().toUpperCase()));
edge.setAnimated(dto.isAnimated());
if (dto.styleDto() != null) {
edge.setStroke(dto.styleDto().stroke());
edge.setStrokeWidth(dto.styleDto().strokeWidth());
}
edge.setGraph(graph); // 연관관계 설정
return edge;
})
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,17 @@ public class Edge extends BaseEntity {

@Column
private String targetNodeKey;

@Column
@Enumerated(EnumType.STRING)
private EdgeType edgeType;

@Column
boolean isAnimated;

@Column
private String stroke;

@Column
private Double strokeWidth;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,15 @@ public class Node extends BaseEntity {
@Enumerated(EnumType.STRING)
private NodeType nodeType;

@Column
private boolean selected;

@Column
private boolean dragging;

@ElementCollection
@CollectionTable(name = "node_data", joinColumns = @JoinColumn(name = "node_id"))
@MapKeyColumn(name = "data_key")
@Column(name = "data_value")
private Map<String, String> data = new HashMap<>();

@Column
private double positionX;

@Column
private double positionY;

@Column
private double width;
private double positonX;

@Column
private double height;
private double positonY;
}
Loading