Skip to content

Commit

Permalink
Merge pull request #88 from Team-KeepGoing/feature/damage
Browse files Browse the repository at this point in the history
Feat :: Damage Create, Read, Delete
  • Loading branch information
priverg authored Oct 11, 2024
2 parents 9143e13 + bf0891a commit a862ee2
Show file tree
Hide file tree
Showing 11 changed files with 266 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public BaseResponse selectAllBook() {
}

@Override
@Transactional(readOnly = true)
@Transactional
public BaseResponse deleteBook(String nfcCode, Authentication auth) {
if (nfcCode == null || nfcCode.isEmpty()) {
return new BaseResponse(HttpStatus.NOT_FOUND, "Invalid NFC code");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.keepgoing.keepserver.domain.damage.entity;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EntityListeners(AuditingEntityListener.class)
@Table(name = "damage")
public class Damage {
/*
id
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long idx;

/*
기기 식별 코드 (nfc/이름)
*/
@Column(nullable = false)
private String code;

/*
문제 유형
*/
@Column(nullable = false)
private String issueType;

/*
유형에 맞는 자세한 내용
*/
@Lob
@Column(nullable = false, columnDefinition = "MEDIUMTEXT")
private String description;

/*
신고 날짜
*/
@Column(nullable = false)
private LocalDateTime reportDate;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.keepgoing.keepserver.domain.damage.mapper;

import com.keepgoing.keepserver.domain.damage.entity.Damage;
import com.keepgoing.keepserver.domain.damage.payload.request.DamageCreateRequest;
import com.keepgoing.keepserver.domain.damage.payload.response.DamageResponseDto;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper(componentModel = "spring")
public interface DamageMapper {

DamageResponseDto entityToDto(Damage damage);

@Mapping(target = "reportDate", expression = "java(java.time.LocalDateTime.now())")
Damage dtoToEntity(DamageCreateRequest damageCreateRequest);
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.keepgoing.keepserver.domain.damage.payload.request;

import jakarta.validation.constraints.NotBlank;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class DamageCreateRequest {
@NotBlank(message = "Code cannot be blank")
private String code;

@NotBlank(message = "Issue type cannot be blank")
private String issueType;

@NotBlank(message = "Description cannot be blank")
private final String description;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.keepgoing.keepserver.domain.damage.payload.response;

import lombok.Builder;

import java.time.LocalDateTime;

@Builder
public record DamageResponseDto(
Long idx,
String code,
String issueType,
String description,
LocalDateTime reportDate
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.keepgoing.keepserver.domain.damage.presentation;

import com.keepgoing.keepserver.domain.damage.payload.request.DamageCreateRequest;
import com.keepgoing.keepserver.domain.damage.service.DamageService;
import com.keepgoing.keepserver.global.common.BaseResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j
@Tag(name = "파손", description = " 관련 api 입니다.")
@RequiredArgsConstructor
@RestController
@RequestMapping("/damage")
public class DamageController {
private final DamageService damageService;

@Operation(summary = "파손 등록", description = "파손된 항목 등록을 진행합니다.")
@PostMapping("/report")
public BaseResponse reportDamage(@Valid @RequestBody DamageCreateRequest request) {
return damageService.reportDamage(request);
}

@Operation(summary = "파손 정보 불러오기", description = "파손된 항목들을 불러옵니다.")
@GetMapping("/all")
public BaseResponse getAllDamages() {
return damageService.getAllDamages();
}

@Operation(summary = "파손 정보 삭제하기", description = "파손된 항목을 삭제합니다.")
@DeleteMapping("/{id}")
public BaseResponse deleteDamage(@PathVariable Long id) {
return damageService.deleteDamage(id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.keepgoing.keepserver.domain.damage.repository;

import com.keepgoing.keepserver.domain.damage.entity.Damage;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface DamageRepository extends JpaRepository<Damage, Long> {
boolean existsByCodeAndIssueType(String code, String issueType);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.keepgoing.keepserver.domain.damage.service;

import com.keepgoing.keepserver.domain.damage.payload.request.DamageCreateRequest;
import com.keepgoing.keepserver.global.common.BaseResponse;

public interface DamageService {

BaseResponse reportDamage(DamageCreateRequest request);

BaseResponse getAllDamages();

BaseResponse deleteDamage(Long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.keepgoing.keepserver.domain.damage.service;

import com.keepgoing.keepserver.domain.damage.entity.Damage;
import com.keepgoing.keepserver.domain.damage.mapper.DamageMapper;
import com.keepgoing.keepserver.domain.damage.payload.request.DamageCreateRequest;
import com.keepgoing.keepserver.domain.damage.payload.response.DamageResponseDto;
import com.keepgoing.keepserver.domain.damage.repository.DamageRepository;
import com.keepgoing.keepserver.global.common.BaseResponse;
import com.keepgoing.keepserver.global.exception.damage.DamageError;
import com.keepgoing.keepserver.global.exception.damage.DamageException;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
public class DamageServiceImpl implements DamageService {

private final DamageRepository damageRepository;
private final DamageMapper damageMapper;

@Override
@Transactional
public BaseResponse reportDamage(DamageCreateRequest request) {
validateDuplicate(request.getCode(), request.getIssueType());
Damage damage = damageMapper.dtoToEntity(request);
damageRepository.save(damage);
return new BaseResponse(HttpStatus.OK, "파손 정보 등록 성공", damage);
}

@Override
@Transactional(readOnly = true)
public BaseResponse getAllDamages() {
List<DamageResponseDto> damages = damageRepository.findAll().stream()
.map(damageMapper::entityToDto)
.toList();
if (damages.isEmpty()) {
throw new DamageException(DamageError.INVALID_DAMAGE);
}
return new BaseResponse(HttpStatus.OK, "파손 정보 불러오기 성공", damages);
}

@Override
@Transactional
public BaseResponse deleteDamage(Long id) {
findDamageById(id);
damageRepository.deleteById(id);
return new BaseResponse(HttpStatus.OK, "파손 정보 삭제 성공");
}

private void validateDuplicate(String code, String issueType) {
boolean isDuplicate = damageRepository.existsByCodeAndIssueType(code, issueType);
if (isDuplicate) {
throw new DamageException(DamageError.DUPLICATE);
}
}

private void findDamageById(Long id) {
damageRepository.findById(id)
.orElseThrow(() -> new DamageException(DamageError.INVALID_DAMAGE));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.keepgoing.keepserver.global.exception.damage;

import com.keepgoing.keepserver.global.exception.error.ErrorProperty;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
@RequiredArgsConstructor
public enum DamageError implements ErrorProperty {
INVALID_DAMAGE(HttpStatus.NOT_FOUND, "파손 정보가 없습니다."),
DUPLICATE(HttpStatus.NOT_FOUND, "이미 같은 문제로 신고된 기기입니다.");
private final HttpStatus status;
private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.keepgoing.keepserver.global.exception.damage;

import com.keepgoing.keepserver.global.exception.BusinessException;

public class DamageException extends BusinessException {
private static final DamageException INVALID_DAMAGE = new DamageException(DamageError.INVALID_DAMAGE);
private static final DamageException DUPLICATE = new DamageException(DamageError.DUPLICATE);

public DamageException(DamageError error) {
super(error);
}

public static DamageException invalidDamage() {
return INVALID_DAMAGE;
}

public static DamageException duplicate() {
return DUPLICATE;
}
}

0 comments on commit a862ee2

Please sign in to comment.