From 48ce27680ce274f97296d711d31d9f72ab575833 Mon Sep 17 00:00:00 2001 From: koseonje Date: Wed, 29 Jan 2025 16:50:05 +0900 Subject: [PATCH] =?UTF-8?q?[DDING-83]=20Form=20=EB=B0=8F=20FormField=20?= =?UTF-8?q?=EC=97=94=ED=84=B0=ED=8B=B0=20=EC=84=B8=ED=8C=85=20(#229)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/converter/StringListConverter.java | 31 +++++++++ .../domain/form/entity/FieldType.java | 9 +++ .../ddingdongBE/domain/form/entity/Form.java | 54 ++++++++++++++++ .../domain/form/entity/FormField.java | 63 +++++++++++++++++++ .../form/repository/FormFieldRepository.java | 8 +++ .../form/repository/FormRepository.java | 8 +++ .../V34__from_and_field_create_table.sql | 28 +++++++++ 7 files changed, 201 insertions(+) create mode 100644 src/main/java/ddingdong/ddingdongBE/common/converter/StringListConverter.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/form/entity/FieldType.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormFieldRepository.java create mode 100644 src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormRepository.java create mode 100644 src/main/resources/db/migration/V34__from_and_field_create_table.sql diff --git a/src/main/java/ddingdong/ddingdongBE/common/converter/StringListConverter.java b/src/main/java/ddingdong/ddingdongBE/common/converter/StringListConverter.java new file mode 100644 index 00000000..b405c995 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/common/converter/StringListConverter.java @@ -0,0 +1,31 @@ +package ddingdong.ddingdongBE.common.converter; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import java.util.List; + +@Converter +public class StringListConverter implements AttributeConverter, String> { + + private final ObjectMapper mapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(List dataList) { + try { + return mapper.writeValueAsString(dataList); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + + @Override + public List convertToEntityAttribute(String data) { + try { + return mapper.readValue(data, List.class); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FieldType.java b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FieldType.java new file mode 100644 index 00000000..b9b1a4cd --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FieldType.java @@ -0,0 +1,9 @@ +package ddingdong.ddingdongBE.domain.form.entity; + +public enum FieldType { + CHECK_BOX, + RADIO, + TEXT, + LONG_TEXT, + FILE +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java new file mode 100644 index 00000000..aea56abc --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/Form.java @@ -0,0 +1,54 @@ +package ddingdong.ddingdongBE.domain.form.entity; + +import ddingdong.ddingdongBE.common.BaseEntity; +import ddingdong.ddingdongBE.domain.club.entity.Club; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import java.time.LocalDate; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class Form extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String title; + + private String description; + + @Column(nullable = false) + private LocalDate startDate; + + @Column(nullable = false) + private LocalDate endDate; + + @Column(nullable = false) + private boolean hasInterview; + + @ManyToOne(fetch = FetchType.LAZY) + private Club club; + + @Builder + private Form(String title, String description, LocalDate startDate, LocalDate endDate, boolean hasInterview, + Club club) { + this.title = title; + this.description = description; + this.startDate = startDate; + this.endDate = endDate; + this.hasInterview = hasInterview; + this.club = club; + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java new file mode 100644 index 00000000..e810fbcb --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/entity/FormField.java @@ -0,0 +1,63 @@ +package ddingdong.ddingdongBE.domain.form.entity; + +import ddingdong.ddingdongBE.common.BaseEntity; +import ddingdong.ddingdongBE.common.converter.StringListConverter; +import jakarta.persistence.Column; +import jakarta.persistence.Convert; +import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.ManyToOne; +import java.util.List; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Getter +public class FormField extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String question; + + @Column(nullable = false) + private boolean required; + + @Column(nullable = false) + private int fieldOrder; + + @Column(nullable = false) + private String section; + + @Convert(converter = StringListConverter.class) + private List options; + + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private FieldType fieldType; + + @ManyToOne(fetch = FetchType.LAZY) + private Form form; + + @Builder + private FormField(String question, FieldType fieldType, boolean required, int fieldOrder, String section, + List options, Form form) { + this.question = question; + this.fieldType = fieldType; + this.required = required; + this.fieldOrder = fieldOrder; + this.section = section; + this.options = options; + this.form = form; + } +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormFieldRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormFieldRepository.java new file mode 100644 index 00000000..0480309b --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormFieldRepository.java @@ -0,0 +1,8 @@ +package ddingdong.ddingdongBE.domain.form.repository; + +import ddingdong.ddingdongBE.domain.form.entity.FormField; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FormFieldRepository extends JpaRepository { + +} diff --git a/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormRepository.java new file mode 100644 index 00000000..8ea4bdf5 --- /dev/null +++ b/src/main/java/ddingdong/ddingdongBE/domain/form/repository/FormRepository.java @@ -0,0 +1,8 @@ +package ddingdong.ddingdongBE.domain.form.repository; + +import ddingdong.ddingdongBE.domain.form.entity.Form; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface FormRepository extends JpaRepository { + +} diff --git a/src/main/resources/db/migration/V34__from_and_field_create_table.sql b/src/main/resources/db/migration/V34__from_and_field_create_table.sql new file mode 100644 index 00000000..9d19c7a7 --- /dev/null +++ b/src/main/resources/db/migration/V34__from_and_field_create_table.sql @@ -0,0 +1,28 @@ +CREATE TABLE form +( + id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(255) NOT NULL, + description VARCHAR(255), + start_date DATE NOT NULL, + end_date DATE NOT NULL, + has_interview BOOLEAN NOT NULL, + club_id BIGINT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NULL, + CONSTRAINT fk_form_club FOREIGN KEY (club_id) REFERENCES club (id) ON DELETE CASCADE +); + +CREATE TABLE form_field +( + id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY, + question VARCHAR(255) NOT NULL, + field_type VARCHAR(50) NOT NULL, + required BOOLEAN NOT NULL, + field_order INT NOT NULL, + section VARCHAR(255) NOT NULL, + options TEXT, + form_id BIGINT, + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP NULL, + updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NULL, + CONSTRAINT fk_form_field_form FOREIGN KEY (form_id) REFERENCES form (id) ON DELETE CASCADE +);