Skip to content

Commit

Permalink
Feat : Career 활동 태그 생성, 조회, 삭제 API 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
hyeonda02 committed Jul 26, 2024
1 parent 2fe59eb commit d51dfa5
Show file tree
Hide file tree
Showing 10 changed files with 237 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import umc.kkijuk.server.common.domian.exception.InvalidTagNameException;
import umc.kkijuk.server.common.domian.exception.ResourceNotFoundException;
import umc.kkijuk.server.common.domian.exception.ReviewRecruitNotMatchException;
import umc.kkijuk.server.common.domian.response.ErrorResponse;
Expand All @@ -24,4 +25,10 @@ public ErrorResponse resourceNotFoundException(ResourceNotFoundException excepti
public ErrorResponse ReviewRecruitMatchException(ReviewRecruitNotMatchException exception) {
return new ErrorResponse(exception.getMessage());
}

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(InvalidTagNameException.class)
public ErrorResponse DuplicateTagNameException(InvalidTagNameException exception) {
return new ErrorResponse(exception.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package umc.kkijuk.server.common.domian.exception;

public class InvalidTagNameException extends RuntimeException{
public InvalidTagNameException(String message) {
super(message);

}
}
46 changes: 46 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/controller/TagController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package umc.kkijuk.server.tag.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import umc.kkijuk.server.tag.domain.Tag;
import umc.kkijuk.server.tag.dto.TagRequestDto;
import umc.kkijuk.server.tag.dto.TagResponseDto;
import umc.kkijuk.server.tag.dto.converter.TagConverter;
import umc.kkijuk.server.tag.service.TagService;

@io.swagger.v3.oas.annotations.tags.Tag(name="tag",description = "태그 관련 API")
@RestController
@RequiredArgsConstructor
@RequestMapping("/career")
public class TagController {

private final TagService tagService;

@PostMapping("/tag")
@Operation(summary = "태그 추가 API", description = "태그 - 태그를 생성하는 API")
public ResponseEntity<TagResponseDto.ResultTagDto> create(@RequestBody @Valid TagRequestDto.CreateTagDto request) {
Tag createTag = tagService.createTag(request);
return ResponseEntity
.ok()
.body(TagConverter.toTagResult(createTag));
}
@GetMapping("/tag")
@Operation(summary = "태그 조회 API", description = "태그 - 태그 조회하는 API")
public ResponseEntity<TagResponseDto.ResultTagDtoList> read() {
return ResponseEntity
.ok()
.body(tagService.findAllTags());
}
@DeleteMapping("/tag/{tagId}")
@Operation(summary = "태그 삭제 API",description = "태그 - 태그를 삭제하는 API")
@Parameter(name = "tagId",description = "태그 Id, path variable 입니다. 존재하는 태그 Id 값을 넘겨 주세요.",example = "1")
public ResponseEntity<Object> delete(@PathVariable Long tagId) {
tagService.delete(tagId);
return ResponseEntity.ok().body(null);
}

}
18 changes: 18 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/domain/Tag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package umc.kkijuk.server.tag.domain;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Builder
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Tag {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="hashtag_id")
private Long id;
@Column(name="hashtag_name", length = 30) //일단 length 30 ( 최대 길이 여쭤보고 변경해야 함. )
private String name;

}
25 changes: 25 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/dto/TagRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package umc.kkijuk.server.tag.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;


public class TagRequestDto {
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class CreateTagDto{
@NotBlank(message = "해시태그 이름은 필수 입력 사항입니다.")
@Size(max = 30)
@Schema(description = "해시태그 이름", example = "역량 키워드", type="string")
String tagName;


}
}
32 changes: 32 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/dto/TagResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package umc.kkijuk.server.tag.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.List;

public class TagResponseDto {
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ResultTagDto{
@Schema(description = "생성된 활동 태그 Id", example = "1", type = "Long")
private Long id;
@Schema(description = "생성된 활동 태그 이름", example = "핵심 역량", type = "String")
private String tagName;
}
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class ResultTagDtoList{
@Schema(description = "활동 태그들의 개수",example = "3")
private int count;
@Schema(description = "활동 태그들 리스트")
private List<ResultTagDto> tagList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package umc.kkijuk.server.tag.dto.converter;

import umc.kkijuk.server.tag.domain.Tag;
import umc.kkijuk.server.tag.dto.TagRequestDto;
import umc.kkijuk.server.tag.dto.TagResponseDto;

import java.util.List;
import java.util.stream.Collectors;

public class TagConverter {
public static Tag toTag(TagRequestDto.CreateTagDto request) {
return Tag.builder()
.name(request.getTagName())
.build();
}
public static TagResponseDto.ResultTagDto toTagResult(Tag hashTag) {
return TagResponseDto.ResultTagDto.builder()
.id(hashTag.getId())
.tagName(hashTag.getName())
.build();
}

public static TagResponseDto.ResultTagDtoList toResultTagDtoList(List<Tag> tagList) {
return TagResponseDto.ResultTagDtoList.builder()
.count(tagList.size())
.tagList(tagList.stream().map(
value -> TagResponseDto.ResultTagDto.builder()
.tagName(value.getName())
.id(value.getId())
.build()
).collect(Collectors.toList()))
.build();
}

}
11 changes: 11 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/repository/TagRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package umc.kkijuk.server.tag.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import umc.kkijuk.server.tag.domain.Tag;

import java.util.List;

public interface TagRepository extends JpaRepository<Tag,Long> {
boolean existsByName(String name);
List<Tag> findAll();
}
12 changes: 12 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/service/TagService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package umc.kkijuk.server.tag.service;

import umc.kkijuk.server.tag.domain.Tag;
import umc.kkijuk.server.tag.dto.TagRequestDto;
import umc.kkijuk.server.tag.dto.TagResponseDto;


public interface TagService {
Tag createTag(TagRequestDto.CreateTagDto request);
TagResponseDto.ResultTagDtoList findAllTags();
void delete(Long tagId);
}
43 changes: 43 additions & 0 deletions src/main/java/umc/kkijuk/server/tag/service/TagServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package umc.kkijuk.server.tag.service;


import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import umc.kkijuk.server.common.domian.exception.InvalidTagNameException;
import umc.kkijuk.server.tag.domain.Tag;
import umc.kkijuk.server.tag.dto.TagRequestDto;
import umc.kkijuk.server.tag.dto.TagResponseDto;
import umc.kkijuk.server.tag.dto.converter.TagConverter;
import umc.kkijuk.server.tag.repository.TagRepository;

import java.util.List;
import java.util.Optional;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class TagServiceImpl implements TagService {
private final TagRepository tagRepository;
@Override
@Transactional
public Tag createTag(TagRequestDto.CreateTagDto request) {
String tagName = request.getTagName();
if (tagName == null || tagName.trim().isEmpty() || tagRepository.existsByName(tagName)) {
throw new InvalidTagNameException("태그 이름은 공백일 수 없으며, 이미 존재하는 이름은 사용할 수 없습니다.");
}
Tag hashTag = TagConverter.toTag(request);
return tagRepository.save(hashTag);
}
@Override
public TagResponseDto.ResultTagDtoList findAllTags() {
return TagConverter.toResultTagDtoList(tagRepository.findAll());
}
@Override
@Transactional
public void delete(Long tagId) {
Tag deleteTag = tagRepository.findById(tagId).get();
tagRepository.delete(deleteTag);
}

}

0 comments on commit d51dfa5

Please sign in to comment.