Skip to content

Commit

Permalink
feat: 수어 사전 단어 리스트 조회 api 구현 (#73)
Browse files Browse the repository at this point in the history
* chore: sign word db 수정

* feat: entity 수정 및 생성

* refactor: value 작성

* refactor: 오타 수정

* feat: dto, repository, service 로직 작성

* feat: controller 로직 작성

* refactor: 코드 리팩토링

* style: checkstyle 오류 수정

* refactor: 로직 수정
  • Loading branch information
hanbirang authored Dec 5, 2024
1 parent 4be9024 commit e8fad7e
Show file tree
Hide file tree
Showing 8 changed files with 156 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package site.sonisori.sonisori.common.enums;

public enum ResourceType {
image, video
}
Original file line number Diff line number Diff line change
@@ -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<List<SignWordResponse>> getAllSignWords() {
List<SignWordResponse> signWords = signWordService.getAllSignWords();
return ResponseEntity.ok(signWords);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package site.sonisori.sonisori.dto.signword;

public record SignWordResponse(
Long id,
String word
) {
}
12 changes: 11 additions & 1 deletion src/main/java/site/sonisori/sonisori/entity/SignWord.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,16 @@
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")
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SignWord {
public class SignWord extends DateEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand All @@ -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);
}
}
50 changes: 50 additions & 0 deletions src/main/java/site/sonisori/sonisori/entity/SignWordResource.java
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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<SignWord, Long> {
}
24 changes: 24 additions & 0 deletions src/main/java/site/sonisori/sonisori/service/SignWordService.java
Original file line number Diff line number Diff line change
@@ -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<SignWordResponse> getAllSignWords() {
List<SignWord> signWords = signWordRepository.findAll();
return signWords.stream()
.map(SignWord::toDto)
.collect(Collectors.toList());
}
}
24 changes: 24 additions & 0 deletions src/main/resources/db/migration/V4__modify_sign_word_table.sql
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit e8fad7e

Please sign in to comment.