Skip to content
Merged
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
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-webflux'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@
@RequiredArgsConstructor
public class CrewService implements CreateCrewUseCase {
private final CrewRepository crewRepository;

@Override
public CrewCreateResponse createCrew(CrewCreateRequest request) {
Crew crew = crewRepository.save(request.to());
Crew crew = crewRepository.save(request.to(request.leader()));

return CrewCreateResponse.of(crew);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
import com.retrip.crew.domain.entity.Crew;
import jakarta.validation.constraints.Size;

import java.util.UUID;

public record CrewCreateRequest(
UUID leader,
@Size(min = 1, max = 30)
String title
String title,
@Size(min = 1, max = 500)
String description
){

public Crew to() {
return Crew.create(this.title);
public Crew to(UUID leader) {
return Crew.create(this.title, this.description, leader);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,18 @@

import java.util.UUID;

public record CrewCreateResponse (
UUID id
){
public static CrewCreateResponse of(Crew crew){
public record CrewCreateResponse(
UUID id,
String title,
String description,
UUID leaderId
) {
public static CrewCreateResponse of(Crew crew) {
return new CrewCreateResponse(
crew.getId()
crew.getId(),
crew.getTitle().getValue(),
crew.getDescription().getValue(),
crew.getLeader().getId()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.retrip.crew.domain.converter;

import com.retrip.crew.domain.entity.CrewMemberRole;
import jakarta.persistence.AttributeConverter;
import jakarta.persistence.Converter;

@Converter(autoApply = true)
public class CrewMemberRoleConverter implements AttributeConverter<CrewMemberRole, String> {
@Override
public String convertToDatabaseColumn(CrewMemberRole crewMemberRole) {
if(crewMemberRole == null){
throw new NullPointerException("crewMemberRole을 DB 칼럼으로 변경하는 과정에서 null이 포함되었습니다.");
}
return crewMemberRole.getCode();
}

@Override
public CrewMemberRole convertToEntityAttribute(String dbData) {
if(dbData == null){
throw new NullPointerException("CrewMember 테이블의 role 값이 null입니다.");
}
return CrewMemberRole.codeOf(dbData);
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/Announcement.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.retrip.crew.domain.entity;

import com.retrip.crew.domain.vo.AnnouncementContent;
import com.retrip.crew.domain.vo.AnnouncementTitle;
import com.retrip.crew.domain.vo.NotificationBoardContent;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Announcement extends BaseEntity {
@Id
@Column(columnDefinition = "varbinary(16)")
private UUID id;

@Embedded
private AnnouncementTitle title;

@Embedded
private AnnouncementContent content;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "crew_id",
nullable = false,
columnDefinition = "varbinary(16)",
foreignKey = @ForeignKey(name = "fk_notification_board_to_crew")
)
private Crew crew;
}
26 changes: 26 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/Announcements.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.retrip.crew.domain.entity;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;

@Getter
@Embeddable
public class Announcements {
@OneToMany(mappedBy = "crew", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Announcement> values = new ArrayList<>();

public Announcements() {
this.values = createEmptyValues();
}

private List<Announcement> createEmptyValues() {
return new ArrayList<>();
}
}
51 changes: 40 additions & 11 deletions src/main/java/com/retrip/crew/domain/entity/Crew.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.retrip.crew.domain.entity;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Version;
import com.retrip.crew.domain.vo.CrewDescription;
import com.retrip.crew.domain.vo.CrewTitle;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -12,24 +11,54 @@

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Crew extends BaseEntity {
@Id
@Column(columnDefinition = "varbinary(16)")
@Getter
private UUID id;

@Column
private String title;
@Getter
@Embedded
private CrewTitle title;

@Embedded
@Getter
private CrewDescription description;


@Embedded
private CrewMembers crewMembers;


@Embedded
private Posts posts;

@Embedded
private Announcements announcements;

@Embedded
private Introductions introductions;


@Version
private long version;

private Crew(String title) {
private Crew(String name, String description, UUID leader) {
this.id = UUID.randomUUID();
this.title = title;
this.title = new CrewTitle(name);
this.description = new CrewDescription(description);
this.crewMembers = new CrewMembers(this, leader);
this.posts = new Posts();
this.announcements = new Announcements();
this.introductions = new Introductions();
}

public static Crew create(String title) {
return new Crew(title);
public static Crew create(String title, String description, UUID leader) {
return new Crew(title, description, leader);
}

public CrewMember getLeader() {
return crewMembers.getLeader();
}

}
40 changes: 40 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/CrewMember.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.retrip.crew.domain.entity;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.UUID;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
@Getter
public class CrewMember extends BaseEntity {
@Id
@Column(columnDefinition = "varbinary(16)")
private UUID id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "crew_id",
nullable = false,
columnDefinition = "varbinary(16)",
foreignKey = @ForeignKey(name = "fk_crew_member_to_crew")
)
private Crew crew;

@Column(name = "role", length = 50, nullable = false)
private CrewMemberRole crewMemberRole;

@Column(nullable = false)
private UUID memberId;

public CrewMember(Crew crew, UUID memberId, CrewMemberRole crewMemberRole) {
this.id = UUID.randomUUID();
this.crew = crew;
this.memberId = memberId;
this.crewMemberRole = CrewMemberRole.valueOf(crewMemberRole.name());
}
}
25 changes: 25 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/CrewMemberRole.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.retrip.crew.domain.entity;


import lombok.AllArgsConstructor;
import lombok.Getter;

import java.util.Arrays;

@Getter
@AllArgsConstructor
public enum CrewMemberRole {
LEADER("LEADER", "리더"),
PARTICIPANT("PARTICIPANT", "참가자");

private final String code;
private final String viewName;

public static CrewMemberRole codeOf(String code) {
return Arrays.stream(CrewMemberRole.values())
.filter(crewMemberRole -> crewMemberRole.getCode().equals(code))
.findAny()
.orElseThrow(() -> new IllegalArgumentException("존재하지 않는 코드입니다."));
}
}

32 changes: 32 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/CrewMembers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.retrip.crew.domain.entity;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
@Embeddable
public class CrewMembers {
@OneToMany(mappedBy = "crew", cascade = CascadeType.ALL, orphanRemoval = true)
private List<CrewMember> values = new ArrayList<>();

public CrewMembers(Crew crew, UUID member) {
this.values = createLeader(crew, member);
}

private List<CrewMember> createLeader(Crew crew, UUID memberId) {
return List.of(new CrewMember(crew, memberId, CrewMemberRole.LEADER));
}

public CrewMember getLeader() {
return this.values.stream().filter(it -> it.getCrewMemberRole() == CrewMemberRole.LEADER).findFirst().orElse(null);
}
}
34 changes: 34 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/Introduction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.retrip.crew.domain.entity;

import com.retrip.crew.domain.vo.IntroductionContent;
import com.retrip.crew.domain.vo.IntroductionTitle;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.UUID;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
public class Introduction extends BaseEntity {
@Id
@Column(columnDefinition = "varbinary(16)")
private UUID id;

@Embedded
private IntroductionTitle title;

@Embedded
private IntroductionContent content;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "crew_id",
nullable = false,
columnDefinition = "varbinary(16)",
foreignKey = @ForeignKey(name = "fk_self_introduce_board_to_crew")
)
private Crew crew;
}
24 changes: 24 additions & 0 deletions src/main/java/com/retrip/crew/domain/entity/Introductions.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.retrip.crew.domain.entity;

import jakarta.persistence.CascadeType;
import jakarta.persistence.Embeddable;
import jakarta.persistence.OneToMany;
import lombok.Getter;

import java.util.ArrayList;
import java.util.List;

@Getter
@Embeddable
public class Introductions {
@OneToMany(mappedBy = "crew", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Introduction> values = new ArrayList<>();

public Introductions() {
this.values = createEmptyValues();
}

private List<Introduction> createEmptyValues() {
return new ArrayList<>();
}
}
Loading