Skip to content

Commit

Permalink
Feat/#44 add group pray (#49)
Browse files Browse the repository at this point in the history
* feat: add category domain

* feat: pray domain update

* feat: category domain & CRUD api

* refactor: swagger tag 통일

* refactor: prayService category 추가

* feat: category 이름 중복 불가능 제약 조건 추가

* feat: category 개수 7개 제약 조건 추가

* feat: pray 조회 시 category 별로 모아서 리턴

* feat: pray table prayType 추가

* fix: signup exception throw 변경

* fix: initDb authority 추가

* feat: ClubPray 객체 생성
+a) 연관 관계 연결

* refactor: init db 객체 생성 오류 수정

* fix: pray id 생성젼략 명시

* feat: club pray 생성 메서드 구현

* feat: club pray 수정 메서드 구현

* refactor: pray QueryDSL 파일 package 변경

* feat: clubpray 조회기능 구현

* feat: clubpray controller 구현

* feat: clubpray 삭제 기능 구현

* refactor: delete unused GeneratedValue

* fix: fix prayType error

* refactor: make existsCategoryByIdAndMember method

* Modify/#45 encrypt pray description (#48)

* refactor: init db 객체 생성 오류 수정

* modify: 기도제목 암호화해서 db에 저장하게 변경

* ♻️ refactor: club -> group 으로 이름 변경

* ♻️ refactor: url 변수 카멜 case로 변경
+ 업데이트 mapping PutMapping으로 변경

* feat: ClubPray 객체 생성
+a) 연관 관계 연결

* refactor: init db 객체 생성 오류 수정

* feat: club pray 생성 메서드 구현

* feat: club pray 수정 메서드 구현

* refactor: pray QueryDSL 파일 package 변경

* feat: clubpray 조회기능 구현

* feat: clubpray controller 구현

* feat: clubpray 삭제 기능 구현

* ♻️ refactor: club -> group 으로 이름 변경

* ♻️ refactor: url 변수 카멜 case로 변경
+ 업데이트 mapping PutMapping으로 변경

* fix: merge conflict 해결

* fix: merge conflict 해결

---------

Co-authored-by: baebae02 <bae4614@gmail.com>
Co-authored-by: Seo Hyeon Bae <76519535+baebae02@users.noreply.github.com>
  • Loading branch information
3 people authored Nov 7, 2023
1 parent 78340bb commit 0313270
Show file tree
Hide file tree
Showing 19 changed files with 421 additions and 48 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.uspray.uspray.DTO.grouppray;

import lombok.Data;

@Data
public class GroupPrayRequestDto {

private Long groupId;
private String content;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.uspray.uspray.DTO.grouppray;

import com.querydsl.core.annotations.QueryProjection;
import lombok.Data;

@Data
public class GroupPrayResponseDto {

private Long groupPrayId;
private String content;
private Boolean isOwner = false;
private Long authorId;
private Integer liked;

@QueryProjection
public GroupPrayResponseDto(Long groupPrayId, String content, Long authorId, Integer liked) {
this.groupPrayId = groupPrayId;
this.content = content;
this.authorId = authorId;
this.liked = liked;
}

public void changeOwner() {
this.isOwner = true;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.uspray.uspray.DTO.grouppray;

import lombok.Data;

@Data
public class GroupPrayUpdateDto {
private Long groupPrayId;
private String content;
}
70 changes: 32 additions & 38 deletions src/main/java/com/uspray/uspray/InitDb.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.uspray.uspray;

import com.uspray.uspray.Enums.Authority;
import com.uspray.uspray.Enums.PrayType;
import com.uspray.uspray.domain.Category;
import com.uspray.uspray.domain.Member;
import com.uspray.uspray.domain.Pray;
Expand All @@ -16,21 +17,14 @@
@RequiredArgsConstructor
public class InitDb {

private final InitService initService;
private final InitService initService;

@PostConstruct
public void init() {
initService.dbInit();
}

@Component
@Transactional
@RequiredArgsConstructor
static class InitService {

private final EntityManager em;
private final PasswordEncoder passwordEncoder;
@PostConstruct
public void init() {
initService.dbInit();
}

@Component
@Transactional
@RequiredArgsConstructor
static class InitService {
Expand All @@ -40,33 +34,33 @@ static class InitService {

@Transactional
public void dbInit() {
Member member = Member.builder()
.userId("test")
.password(passwordEncoder.encode("test"))
.name("홍길동")
.phone("01012345678")
.birth("2002-02-01")
.authority(Authority.ROLE_USER)
.gender("female")
.build();
em.persist(member);
Member member = Member.builder()
.userId("test")
.password(passwordEncoder.encode("test"))
.name("홍길동")
.phone("01012345678")
.birth("2002-02-01")
.gender("female")
.authority(Authority.ROLE_USER)
.build();
em.persist(member);

Category category = Category.builder()
.name("기타 카테고리")
.color("#FFFFFF")
.member(member)
.build();
em.persist(category);
Category category = Category.builder()
.name("기타 카테고리")
.color("#FFFFFF")
.member(member)
.build();
em.persist(category);

Pray pray = Pray.builder()
.content("테스트 기도")
.deadline(LocalDate.parse("2025-01-01"))
.member(member)
.category(category)
.prayType(com.uspray.uspray.Enums.PrayType.PERSONAL)
.build();
em.persist(pray);
Pray pray = Pray.builder()
.content("테스트 기도")
.deadline(LocalDate.parse("2025-01-01"))
.member(member)
.category(category)
.prayType(PrayType.PERSONAL)
.build();
em.persist(pray);
}

}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.uspray.uspray.controller;

import com.uspray.uspray.DTO.ApiResponseDto;
import com.uspray.uspray.DTO.grouppray.GroupPrayRequestDto;
import com.uspray.uspray.DTO.grouppray.GroupPrayResponseDto;
import com.uspray.uspray.DTO.grouppray.GroupPrayUpdateDto;
import com.uspray.uspray.exception.SuccessStatus;
import com.uspray.uspray.service.GroupPrayService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/grouppray")
@Tag(name = "GroupPray", description = "모임 기도제목 API")
@RequiredArgsConstructor
@SecurityRequirement(name = "JWT Auth")
public class GroupPrayController {

private final GroupPrayService groupPrayService;

@Operation(summary = "모임 기도제목 생성")
@PostMapping
public ApiResponseDto<?> createGroupPray(@RequestBody GroupPrayRequestDto groupPrayRequestDto,
@Parameter(hidden = true) @AuthenticationPrincipal User user) {
groupPrayService.createGroupPray(groupPrayRequestDto, user.getUsername());
return ApiResponseDto.success(SuccessStatus.CREATE_GROUP_PRAY_SUCCESS,
SuccessStatus.CREATE_GROUP_PRAY_SUCCESS.getMessage());
}

@Operation(summary = "모임 기도제목 수정")
@PutMapping
public ApiResponseDto<?> updateGroupPray(@RequestBody GroupPrayUpdateDto groupPrayUpdateDto) {
groupPrayService.updateGroupPray(groupPrayUpdateDto);
return ApiResponseDto.success(SuccessStatus.UPDATE_GROUP_PRAY_SUCCESS,
SuccessStatus.UPDATE_GROUP_PRAY_SUCCESS.getMessage());
}

@Operation(summary = "모임 기도제목 조회")
@GetMapping("/{groupId}")
@ApiResponse(
responseCode = "200",
description = "모임 기도제목 목록 반환",
content = @Content(schema = @Schema(implementation = GroupPrayResponseDto.class)))
public ApiResponseDto<List<GroupPrayResponseDto>> getGroupPray(
@PathVariable(name = "groupId") Long groupId,
@Parameter(hidden = true) @AuthenticationPrincipal User user) {
return ApiResponseDto.success(SuccessStatus.GET_GROUP_PRAY_LIST_SUCCESS,
groupPrayService.getGroupPray(groupId, user.getUsername()));
}

@Operation(summary = "모임 기도제목 삭제")
@DeleteMapping("/{groupPrayId}")
public ApiResponseDto<?> deleteGroupPray(@PathVariable(name = "groupPrayId") Long id) {
groupPrayService.deleteGroupPray(id);
return ApiResponseDto.success(SuccessStatus.DELETE_GROUP_PRAY_SUCCESS,
SuccessStatus.DELETE_GROUP_PRAY_SUCCESS.getMessage());
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/uspray/uspray/domain/Group.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.uspray.uspray.domain;

import com.uspray.uspray.common.domain.AuditingTimeEntity;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Group extends AuditingTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long id;

@OneToMany(mappedBy = "group", orphanRemoval = true)
private List<GroupPray> groupPrayList;

}
57 changes: 57 additions & 0 deletions src/main/java/com/uspray/uspray/domain/GroupPray.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.uspray.uspray.domain;

import com.uspray.uspray.common.domain.AuditingTimeEntity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class GroupPray extends AuditingTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "grouppray_id")
private Long id;

private String content;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "group_id")
private Group group;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id")
private Member author;

@Builder
public GroupPray(String content, Group group, Member author) {
this.content = content;
setGroup(group);
setAuthor(author);
}

private void setGroup(Group group) {
this.group = group;
group.getGroupPrayList().add(this);
}

private void setAuthor(Member author) {
this.author = author;
author.getGroupPrayList().add(this);
}

public void changeContent(String content) {
this.content = content;
}
}
5 changes: 5 additions & 0 deletions src/main/java/com/uspray/uspray/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@
import com.uspray.uspray.DTO.notification.NotificationAgreeDto;
import com.uspray.uspray.Enums.Authority;
import com.uspray.uspray.common.domain.AuditingTimeEntity;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand Down Expand Up @@ -47,6 +49,9 @@ public class Member extends AuditingTimeEntity {
@Enumerated(EnumType.STRING)
private Authority authority;

@OneToMany(mappedBy = "author")
private List<GroupPray> groupPrayList;


public void changeFirebaseToken(String firebaseToken) {
this.firebaseToken = firebaseToken;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/uspray/uspray/domain/Pray.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
import com.uspray.uspray.common.domain.AuditingTimeEntity;
import java.time.LocalDate;
import java.util.Base64;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
Expand Down Expand Up @@ -39,9 +41,13 @@ public class Pray extends AuditingTimeEntity {
private Member member;

private String content;

private Integer count;

private LocalDate deadline;

private final Boolean deleted = false;

private Boolean isShared = false;

@Column(name = "origin_pray_id")
Expand All @@ -51,6 +57,10 @@ public class Pray extends AuditingTimeEntity {
@Enumerated(EnumType.STRING)
private PrayType prayType;

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "grouppray_id")
private GroupPray groupPray;

@NotNull
@ManyToOne
@JoinColumn(name = "category_id")
Expand Down
17 changes: 10 additions & 7 deletions src/main/java/com/uspray/uspray/exception/ErrorStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,16 @@ public enum ErrorStatus {
DELETE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 삭제할 권한이 없습니다."),
CATEGORY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다."),

/**
* 404 NOT FOUND
*/
NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"),
PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."),
PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."),
NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다.");
/**
* 404 NOT FOUND
*/
NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"),
NOT_FOUND_GROUP_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 모임입니다"),
NOT_FOUND_GROUP_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 모임 기도입니다"),
PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."),
PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."),
NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다."),
;

private final HttpStatus httpStatus;
private final String message;
Expand Down
Loading

0 comments on commit 0313270

Please sign in to comment.