diff --git a/src/main/java/com/server/hispath/HispathApplication.java b/src/main/java/com/server/hispath/HispathApplication.java index e2d77f7..13c7ac8 100644 --- a/src/main/java/com/server/hispath/HispathApplication.java +++ b/src/main/java/com/server/hispath/HispathApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class HispathApplication { public static void main(String[] args) { diff --git a/src/main/java/com/server/hispath/activity/application/ActivityService.java b/src/main/java/com/server/hispath/activity/application/ActivityService.java index e1fa9db..d0ebcba 100644 --- a/src/main/java/com/server/hispath/activity/application/ActivityService.java +++ b/src/main/java/com/server/hispath/activity/application/ActivityService.java @@ -1,8 +1,18 @@ package com.server.hispath.activity.application; +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.domain.Activity; import com.server.hispath.activity.domain.repository.ActivityRepository; +import com.server.hispath.category.application.CategoryService; +import com.server.hispath.category.domain.Category; +import com.server.hispath.exception.activity.ActivityNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -11,5 +21,46 @@ public class ActivityService { private final ActivityRepository activityRepository; + private final CategoryService categoryService; + + @Transactional + public Long create(Long categoryId, ActivityContentDto dto) { + Category category = categoryService.findById(categoryId); + Activity activity = Activity.from(category, dto); + Activity savedActivity = activityRepository.save(activity); + return savedActivity.getId(); + } + @Transactional(readOnly = true) + public ActivityDto find(Long id) { + Activity activity = this.findById(id); + return ActivityDto.from(activity); + } + + + + @Transactional(readOnly = true) + public List findAll() { + List activities = activityRepository.findAll(); + return activities.stream() + .map(ActivityDto::from) + .collect(Collectors.toList()); + } + + @Transactional + public ActivityDto update(Long id, Long categoryId, ActivityContentDto dto){ + Activity activity = this.findById(id); + Category category = categoryService.findById(categoryId); + activity.update(category, dto); + + return ActivityDto.from(activity); + } + + @Transactional + public void delete(Long id){ + activityRepository.deleteById(id); + } + private Activity findById(Long id) { + return activityRepository.findById(id).orElseThrow(ActivityNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java new file mode 100644 index 0000000..b5a8c3e --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityContentDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.presentation.request.ActivityCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityContentDto { + + private String semester; + private boolean personal; + private int requestStatus; + private String data; + + public static ActivityContentDto from(ActivityCURequest request){ + return new ActivityContentDto(request.getSemester(), request.isPersonal(), request.getRequestStatus(), request.getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java new file mode 100644 index 0000000..74f6df7 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/application/dto/ActivityDto.java @@ -0,0 +1,24 @@ +package com.server.hispath.activity.application.dto; + +import com.server.hispath.activity.domain.Activity; +import com.server.hispath.category.application.dto.CategoryDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityDto { + private Long id; + private CategoryDto categoryDto; + private String semester; + private boolean personal; + private String data; + + public static ActivityDto from(Activity activity) { + return new ActivityDto(activity.getId(), CategoryDto.from(activity.getCategory()), + activity.getSemester(), activity.isPersonal(), activity.getData()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/Activity.java b/src/main/java/com/server/hispath/activity/domain/Activity.java index 4ee2322..b21b85d 100644 --- a/src/main/java/com/server/hispath/activity/domain/Activity.java +++ b/src/main/java/com/server/hispath/activity/domain/Activity.java @@ -4,10 +4,14 @@ import java.util.List; import javax.persistence.*; +import com.server.hispath.activity.application.dto.ActivityContentDto; import com.server.hispath.category.domain.Category; import com.server.hispath.common.BaseEntity; import com.server.hispath.student.domain.participate.Participant; +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -15,7 +19,9 @@ @Entity @Getter +@Builder @NoArgsConstructor +@AllArgsConstructor @Where(clause = "deleted = false") @SQLDelete(sql = "UPDATE activity SET deleted = true Where id = ?") public class Activity extends BaseEntity { @@ -27,14 +33,34 @@ public class Activity extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) private Category category; + @NotNull private String semester; - private boolean personel; + private boolean personal; private int requestStatus; - private String date; + @NotNull + private String data; @OneToMany(mappedBy = "activity") private List participants = new ArrayList<>(); + + public static Activity from(Category category, ActivityContentDto dto) { + return Activity.builder() + .category(category) + .semester(dto.getSemester()) + .personal(dto.isPersonal()) + .requestStatus(dto.getRequestStatus()) + .data(dto.getData()) + .build(); + } + + public void update(Category category, ActivityContentDto dto){ + this.category = category; + this.semester = dto.getSemester(); + this.personal = dto.isPersonal(); + this.requestStatus = dto.getRequestStatus(); + this.data = dto.getData(); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java index 93d5630..5933219 100644 --- a/src/main/java/com/server/hispath/activity/presentation/ActivityController.java +++ b/src/main/java/com/server/hispath/activity/presentation/ActivityController.java @@ -1,13 +1,69 @@ package com.server.hispath.activity.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.activity.application.ActivityService; +import com.server.hispath.activity.application.dto.ActivityContentDto; +import com.server.hispath.activity.application.dto.ActivityDto; +import com.server.hispath.activity.presentation.request.ActivityCURequest; +import com.server.hispath.activity.presentation.response.ActivityResponse; +import com.server.hispath.docs.ApiDoc; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class ActivityController { private final ActivityService activityService; + + @PostMapping("/activity") + @ApiOperation(value = ApiDoc.ACTIVITY_CREATE) + public ResponseEntity create(@RequestBody ActivityCURequest request) { + Long id = activityService.create(request.getCategoryId(), ActivityContentDto.from(request)); + return ResponseEntity.ok(id); + } + + @GetMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_READ) + public ResponseEntity find(@PathVariable Long id) { + + ActivityResponse response = ActivityResponse.from(activityService.find(id)); + return ResponseEntity.ok(response); + + } + + @GetMapping("/activities") + @ApiOperation(value = ApiDoc.ACTIVITY_READ_ALL) + public ResponseEntity> findAll() { + + List responses = activityService.findAll() + .stream() + .map(ActivityResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + + } + + @PatchMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody ActivityCURequest request) { + ActivityDto dto = activityService.update(id, request.getCategoryId(), ActivityContentDto.from(request)); + ActivityResponse response = ActivityResponse.from(dto); + + return ResponseEntity.ok(response); + } + + @DeleteMapping("/activity/{id}") + @ApiOperation(value = ApiDoc.ACTIVITY_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + activityService.delete(id); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java new file mode 100644 index 0000000..9e61e43 --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/request/ActivityCURequest.java @@ -0,0 +1,16 @@ +package com.server.hispath.activity.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class ActivityCURequest { + private Long categoryId; + private String semester; + private boolean personal; + private int requestStatus; + private String data; +} diff --git a/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java new file mode 100644 index 0000000..07985bf --- /dev/null +++ b/src/main/java/com/server/hispath/activity/presentation/response/ActivityResponse.java @@ -0,0 +1,25 @@ +package com.server.hispath.activity.presentation.response; + +import com.server.hispath.activity.application.dto.ActivityDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ActivityResponse { + private Long id; + private Long categoryId; + private String categoryName; + private String semester; + private boolean personal; + private String data; + + public static ActivityResponse from(ActivityDto dto) { + return new ActivityResponse(dto.getId(), dto.getCategoryDto().getId(), dto.getCategoryDto().getName(), + dto.getSemester(), dto.isPersonal(), dto.getData()); + } +} diff --git a/src/main/java/com/server/hispath/category/application/CategoryService.java b/src/main/java/com/server/hispath/category/application/CategoryService.java index 55c0bb1..0b52862 100644 --- a/src/main/java/com/server/hispath/category/application/CategoryService.java +++ b/src/main/java/com/server/hispath/category/application/CategoryService.java @@ -1,8 +1,16 @@ package com.server.hispath.category.application; +import java.util.List; +import java.util.stream.Collectors; + +import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.application.dto.CategoryCUDto; +import com.server.hispath.category.domain.Category; import com.server.hispath.category.domain.repository.CategoryRepository; +import com.server.hispath.exception.category.CategoryNotFoundException; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import lombok.RequiredArgsConstructor; @@ -12,4 +20,39 @@ public class CategoryService { private final CategoryRepository categoryRepository; + @Transactional + public Long create(CategoryCUDto dto) { + Category savedCategory = categoryRepository.save(Category.from(dto)); + return savedCategory.getId(); + } + + @Transactional(readOnly = true) + public CategoryContentDto find(Long id) { + Category category = this.findById(id); + return CategoryContentDto.from(category); + } + + @Transactional(readOnly = true) + public List findAll() { + List categories = categoryRepository.findAll(); + return categories.stream() + .map(CategoryContentDto::from) + .collect(Collectors.toList()); + } + + @Transactional + public CategoryContentDto update(Long id, CategoryCUDto dto){ + Category category = categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + category.update(dto); + return CategoryContentDto.from(category); + } + + @Transactional + public void delete(Long id){ + categoryRepository.deleteById(id); + } + + public Category findById(Long id){ + return categoryRepository.findById(id).orElseThrow(CategoryNotFoundException::new); + } } diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java new file mode 100644 index 0000000..31c5e82 --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryCUDto.java @@ -0,0 +1,20 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.ActivityType; +import com.server.hispath.category.presentation.request.CategoryCURequest; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryCUDto { + private ActivityType type; + private String name; + + public static CategoryCUDto of(CategoryCURequest request) { + return new CategoryCUDto(ActivityType.valueOf(request.getType()), request.getName()); + } +} diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java new file mode 100644 index 0000000..f0e2a2a --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryContentDto.java @@ -0,0 +1,19 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.Category; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryContentDto { + private Long id; + private String name; + + public static CategoryContentDto from(Category category) { + return new CategoryContentDto(category.getId(), category.getName()); + } +} diff --git a/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java new file mode 100644 index 0000000..2f96fa6 --- /dev/null +++ b/src/main/java/com/server/hispath/category/application/dto/CategoryDto.java @@ -0,0 +1,21 @@ +package com.server.hispath.category.application.dto; + +import com.server.hispath.category.domain.ActivityType; +import com.server.hispath.category.domain.Category; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryDto { + private Long id; + private String type; + private String name; + + public static CategoryDto from(Category category) { + return new CategoryDto(category.getId(), category.getType().name(), category.getName()); + } +} diff --git a/src/main/java/com/server/hispath/activity/domain/ActivityType.java b/src/main/java/com/server/hispath/category/domain/ActivityType.java similarity index 57% rename from src/main/java/com/server/hispath/activity/domain/ActivityType.java rename to src/main/java/com/server/hispath/category/domain/ActivityType.java index 1861c09..78d1e50 100644 --- a/src/main/java/com/server/hispath/activity/domain/ActivityType.java +++ b/src/main/java/com/server/hispath/category/domain/ActivityType.java @@ -1,4 +1,4 @@ -package com.server.hispath.activity.domain; +package com.server.hispath.category.domain; public enum ActivityType { MILEAGE_ACTIVITY, PROJECT diff --git a/src/main/java/com/server/hispath/category/domain/Category.java b/src/main/java/com/server/hispath/category/domain/Category.java index 15e0130..8aab04f 100644 --- a/src/main/java/com/server/hispath/category/domain/Category.java +++ b/src/main/java/com/server/hispath/category/domain/Category.java @@ -5,9 +5,11 @@ import javax.persistence.*; import com.server.hispath.activity.domain.Activity; -import com.server.hispath.activity.domain.ActivityType; +import com.server.hispath.category.application.dto.CategoryCUDto; import com.server.hispath.common.BaseEntity; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.SQLDelete; @@ -15,8 +17,10 @@ @Entity @Getter -@NoArgsConstructor @Where(clause = "deleted = false") +@Builder +@NoArgsConstructor +@AllArgsConstructor @SQLDelete(sql = "UPDATE category SET deleted = true Where id = ?") public class Category extends BaseEntity { @@ -31,4 +35,16 @@ public class Category extends BaseEntity { @Enumerated(EnumType.STRING) private ActivityType type; + + public void update(CategoryCUDto dto) { + this.type = dto.getType(); + this.name = dto.getName(); + } + + public static Category from(CategoryCUDto dto) { + return Category.builder() + .type(dto.getType()) + .name(dto.getName()) + .build(); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/CategoryController.java b/src/main/java/com/server/hispath/category/presentation/CategoryController.java index 155c23b..fe812e8 100644 --- a/src/main/java/com/server/hispath/category/presentation/CategoryController.java +++ b/src/main/java/com/server/hispath/category/presentation/CategoryController.java @@ -1,14 +1,69 @@ package com.server.hispath.category.presentation; +import java.util.List; +import java.util.stream.Collectors; + import com.server.hispath.category.application.CategoryService; +import com.server.hispath.category.application.dto.CategoryCUDto; +import com.server.hispath.category.application.dto.CategoryContentDto; +import com.server.hispath.category.presentation.request.CategoryCURequest; +import com.server.hispath.category.presentation.response.CategoryResponse; +import com.server.hispath.docs.ApiDoc; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; -import org.springframework.web.bind.annotation.RestController; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @RestController @RequiredArgsConstructor +@RequestMapping("/api") public class CategoryController { - + private final CategoryService categoryService; + + + @PostMapping("/category") + @ApiOperation(value = ApiDoc.CATEGORY_CREATE) + public ResponseEntity create(@RequestBody CategoryCURequest request) { + Long savedId = categoryService.create(CategoryCUDto.of(request)); + return ResponseEntity.ok(savedId); + } + + + @GetMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_READ) + public ResponseEntity find(@PathVariable Long id) { + CategoryContentDto dto = categoryService.find(id); + CategoryResponse response = CategoryResponse.from(dto); + return ResponseEntity.ok(response); + } + + @GetMapping("/categories") + @ApiOperation(value = ApiDoc.CATEGORY_READ_ALL) + public ResponseEntity> findAll() { + List dtos = categoryService.findAll(); + List responses = dtos.stream() + .map(CategoryResponse::from) + .collect(Collectors.toList()); + return ResponseEntity.ok(responses); + } + + @PatchMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_UPDATE) + public ResponseEntity update(@PathVariable Long id, @RequestBody CategoryCURequest request) { + CategoryContentDto dto = categoryService.update(id, CategoryCUDto.of(request)); + CategoryResponse response = CategoryResponse.from(dto); + + return ResponseEntity.ok(response); + } + + @DeleteMapping("/category/{id}") + @ApiOperation(value = ApiDoc.CATEGORY_DELETE) + public ResponseEntity delete(@PathVariable Long id) { + categoryService.delete(id); + return ResponseEntity.ok(id); + } } diff --git a/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java new file mode 100644 index 0000000..000540b --- /dev/null +++ b/src/main/java/com/server/hispath/category/presentation/request/CategoryCURequest.java @@ -0,0 +1,13 @@ +package com.server.hispath.category.presentation.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +public class CategoryCURequest { + private String type; + private String name; +} diff --git a/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java new file mode 100644 index 0000000..3ffbf4a --- /dev/null +++ b/src/main/java/com/server/hispath/category/presentation/response/CategoryResponse.java @@ -0,0 +1,21 @@ +package com.server.hispath.category.presentation.response; + +import com.server.hispath.category.application.dto.CategoryContentDto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +public class CategoryResponse { + private Long categoryId; + private String name; + + public static CategoryResponse from(CategoryContentDto dto) { + return new CategoryResponse(dto.getId(), dto.getName()); + } +} diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java index 0e1188e..9325290 100644 --- a/src/main/java/com/server/hispath/docs/ApiDoc.java +++ b/src/main/java/com/server/hispath/docs/ApiDoc.java @@ -7,7 +7,16 @@ public class ApiDoc { /* Activity 관련 API 명세 */ + public static final String ACTIVITY_CREATE = "단일 활동 생성"; + public static final String ACTIVITY_READ = "단일 활동 조회"; + public static final String ACTIVITY_READ_ALL = "모든 활동 조회"; + public static final String ACTIVITY_UPDATE = "활동 수정"; + public static final String ACTIVITY_DELETE = "활동 삭제"; /* Category 관련 API 명세 */ - + public static final String CATEGORY_READ = "단일 카테고리 조회"; + public static final String CATEGORY_READ_ALL = "모든 카테고리 조회"; + public static final String CATEGORY_CREATE = "카테고리 생성"; + public static final String CATEGORY_UPDATE = "카테고리 수정"; + public static final String CATEGORY_DELETE = "카테고리 삭제"; } \ No newline at end of file