diff --git a/src/main/java/site/sonisori/sonisori/common/enums/ResourceType.java b/src/main/java/site/sonisori/sonisori/common/enums/ResourceType.java new file mode 100644 index 0000000..c313b8b --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/common/enums/ResourceType.java @@ -0,0 +1,5 @@ +package site.sonisori.sonisori.common.enums; + +public enum ResourceType { + image, video +} diff --git a/src/main/java/site/sonisori/sonisori/controller/SignWordController.java b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java new file mode 100644 index 0000000..209aa7a --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/controller/SignWordController.java @@ -0,0 +1,25 @@ +package site.sonisori.sonisori.controller; + +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import lombok.RequiredArgsConstructor; +import site.sonisori.sonisori.dto.signword.SignWordResponse; +import site.sonisori.sonisori.service.SignWordService; + +@RestController +@RequestMapping("/api") +@RequiredArgsConstructor +public class SignWordController { + private final SignWordService signWordService; + + @GetMapping("/words") + public ResponseEntity> getAllSignWords() { + List signWords = signWordService.getAllSignWords(); + return ResponseEntity.ok(signWords); + } +} diff --git a/src/main/java/site/sonisori/sonisori/dto/signword/SignWordResponse.java b/src/main/java/site/sonisori/sonisori/dto/signword/SignWordResponse.java new file mode 100644 index 0000000..3b91d59 --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/dto/signword/SignWordResponse.java @@ -0,0 +1,7 @@ +package site.sonisori.sonisori.dto.signword; + +public record SignWordResponse( + Long id, + String word +) { +} diff --git a/src/main/java/site/sonisori/sonisori/entity/SignWord.java b/src/main/java/site/sonisori/sonisori/entity/SignWord.java index d4d9413..a0323e0 100644 --- a/src/main/java/site/sonisori/sonisori/entity/SignWord.java +++ b/src/main/java/site/sonisori/sonisori/entity/SignWord.java @@ -12,6 +12,8 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import site.sonisori.sonisori.common.DateEntity; +import site.sonisori.sonisori.dto.signword.SignWordResponse; @Entity @Table(name = "sign_words") @@ -19,7 +21,7 @@ @Builder @NoArgsConstructor @AllArgsConstructor -public class SignWord { +public class SignWord extends DateEntity { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,4 +31,12 @@ public class SignWord { @Column(name = "word") @Size(max = 50) private String word; + + @Column(name = "description") + @Size(max = 500) + private String description; + + public SignWordResponse toDto() { + return new SignWordResponse(this.id, this.word); + } } diff --git a/src/main/java/site/sonisori/sonisori/entity/SignWordResource.java b/src/main/java/site/sonisori/sonisori/entity/SignWordResource.java new file mode 100644 index 0000000..5855e14 --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/entity/SignWordResource.java @@ -0,0 +1,50 @@ +package site.sonisori.sonisori.entity; + +import jakarta.persistence.Column; +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.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import site.sonisori.sonisori.common.DateEntity; +import site.sonisori.sonisori.common.enums.ResourceType; + +@Entity +@Table(name = "sign_word_resources") +@Getter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class SignWordResource extends DateEntity { + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @NotNull + @JoinColumn(name = "sign_word_id") + private SignWord signWord; + + @Column(name = "resource_type") + @Enumerated(EnumType.STRING) + @NotNull + private ResourceType resourceType; + + @NotBlank + @Column(name = "resource_url") + @Size(max = 500) + private String resourceUrl; +} diff --git a/src/main/java/site/sonisori/sonisori/repository/SignWordRepository.java b/src/main/java/site/sonisori/sonisori/repository/SignWordRepository.java new file mode 100644 index 0000000..74a9fe8 --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/repository/SignWordRepository.java @@ -0,0 +1,10 @@ +package site.sonisori.sonisori.repository; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import site.sonisori.sonisori.entity.SignWord; + +@Repository +public interface SignWordRepository extends JpaRepository { +} diff --git a/src/main/java/site/sonisori/sonisori/service/SignWordService.java b/src/main/java/site/sonisori/sonisori/service/SignWordService.java new file mode 100644 index 0000000..c5410ee --- /dev/null +++ b/src/main/java/site/sonisori/sonisori/service/SignWordService.java @@ -0,0 +1,24 @@ +package site.sonisori.sonisori.service; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.stereotype.Service; + +import lombok.RequiredArgsConstructor; +import site.sonisori.sonisori.dto.signword.SignWordResponse; +import site.sonisori.sonisori.entity.SignWord; +import site.sonisori.sonisori.repository.SignWordRepository; + +@Service +@RequiredArgsConstructor +public class SignWordService { + private final SignWordRepository signWordRepository; + + public List getAllSignWords() { + List signWords = signWordRepository.findAll(); + return signWords.stream() + .map(SignWord::toDto) + .collect(Collectors.toList()); + } +} diff --git a/src/main/resources/db/migration/V4__modify_sign_word_table.sql b/src/main/resources/db/migration/V4__modify_sign_word_table.sql new file mode 100644 index 0000000..46353e8 --- /dev/null +++ b/src/main/resources/db/migration/V4__modify_sign_word_table.sql @@ -0,0 +1,24 @@ +ALTER TABLE `sonisori`.`sign_words` + ADD COLUMN `description` VARCHAR(500) NULL AFTER `word`, + ADD COLUMN `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() AFTER `description`, + ADD COLUMN `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP() AFTER `created_at`; + +CREATE TABLE `sonisori`.`sign_word_resources` ( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `sign_word_id` BIGINT NOT NULL, + `resource_type` ENUM('image', 'video') NOT NULL, + `resource_url` VARCHAR(500) NOT NULL, + `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP(), + `updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP() ON UPDATE CURRENT_TIMESTAMP(), + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; + +ALTER TABLE `sonisori`.`sign_word_resources` + ADD INDEX `fk_sign-word-resources_sign-word_id_idx` (`sign_word_id` ASC) VISIBLE; + +ALTER TABLE `sonisori`.`sign_word_resources` + ADD CONSTRAINT `fk_sign-word-resources_sign-word_id` + FOREIGN KEY (`sign_word_id`) + REFERENCES `sonisori`.`sign_words` (`id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION;