Skip to content

Commit

Permalink
✨ [FEATURE] 기본 엔티티 및 연관관계 설정 (#7)
Browse files Browse the repository at this point in the history
* 🐛 fix: 오타 수정 (GroupErrorStatus > GroupErrorCode)

* ♻️ refactor: 도메인 이름 변경 (Group > Organization)

* ✨ feat: Organization 관련 엔티티 정의

* ✨ feat: Announcement 관련 엔티티 정의

* ✨ feat: Propose 관련 엔티티 정의

* ✨ feat: Report 관련 엔티티 정의

* ♻️ refactor: Service에서 Dto를 반환하도록 수정

* 📌 chore: java 버전 명시

* ✨ feat: CustomException 정의, ExceptionAdvice 수정
  • Loading branch information
kimday0326 authored Jan 14, 2024
1 parent c97bbe6 commit 1f208e3
Show file tree
Hide file tree
Showing 46 changed files with 902 additions and 365 deletions.
81 changes: 41 additions & 40 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,60 +1,61 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
id 'java'
id 'org.springframework.boot' version '3.2.0'
id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.sponus'
version = '0.0.1-SNAPSHOT'

java {
sourceCompatibility = '17'
sourceCompatibility = '17'
targetCompatibility = '17'
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
compileOnly {
extendsFrom annotationProcessor
}
}

repositories {
mavenCentral()
mavenCentral()
}

dependencies {
// Core
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'org.slf4j:slf4j-api:2.0.7'

// Lombok
implementation 'org.projectlombok:lombok:1.18.22'
annotationProcessor('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')

// Jwt
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

// Redis
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.2.0'
implementation 'org.springframework.session:spring-session-data-redis:3.1.1'

// Database
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.4'

// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
// Core
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test'
implementation 'org.slf4j:slf4j-api:2.0.7'

// Lombok
implementation 'org.projectlombok:lombok:1.18.22'
annotationProcessor('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')

// Jwt
implementation 'io.jsonwebtoken:jjwt-api:0.12.3'
implementation 'io.jsonwebtoken:jjwt-impl:0.12.3'
implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3'

// Redis
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '3.2.0'
implementation 'org.springframework.session:spring-session-data-redis:3.1.1'

// Database
runtimeOnly 'org.postgresql:postgresql'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'

// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.4'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-api:2.0.4'

// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'
}

tasks.named('test') {
useJUnitPlatform()
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import org.springframework.http.HttpStatus;

import com.sponus.sponusbe.global.common.BaseErrorCode;
import com.sponus.sponusbe.global.dto.ErrorReasonDTO;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand All @@ -20,27 +19,7 @@ public enum TokenErrorCode implements BaseErrorCode {
INTERNAL_TOKEN_EXCEPTION(BAD_REQUEST, "4003", "토큰 에러입니다."),
SIGNATURE_ERROR(BAD_REQUEST, "4004", "무결하지 않은 토큰입니다.");

private final HttpStatus errorStatus;
private final HttpStatus httpStatus;
private final String code;
private final String message;

@Override
public ErrorReasonDTO getReason() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.status(false)
.build();
}

@Override
public ErrorReasonDTO getReasonHttpStatus() {
return ErrorReasonDTO.builder()
.message(message)
.code(code)
.status(false)
.httpStatus(errorStatus)
.build()
;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,19 +32,19 @@ protected void doFilterInternal(
filterChain.doFilter(request, response);
} catch (CustomExpiredJwtException e) {
logger.warn(e.getMessage());
setErrorResponse(response, TOKEN_EXPIRED.getErrorStatus());
setErrorResponse(response, TOKEN_EXPIRED.getHttpStatus());
} catch (CustomMalformedException e) {
logger.warn(e.getMessage());
setErrorResponse(response, INVALID_FORM_TOKEN.getErrorStatus());
setErrorResponse(response, INVALID_FORM_TOKEN.getHttpStatus());
} catch (CustomNoTokenException e) {
logger.warn(e.getMessage());
setErrorResponse(response, NO_TOKEN.getErrorStatus());
setErrorResponse(response, NO_TOKEN.getHttpStatus());
} catch (CustomSignatureException e) {
logger.warn(e.getMessage());
setErrorResponse(response, SIGNATURE_ERROR.getErrorStatus());
setErrorResponse(response, SIGNATURE_ERROR.getHttpStatus());
} catch (Exception e) {
logger.warn(e.getMessage());
e.printStackTrace();
logger.warn(">>>>> Internal Server Error : ", e);

response.getWriter().print(
ApiResponse.onFailure(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,18 @@
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import com.sponus.sponusbe.group.entity.Group;
import com.sponus.sponusbe.domain.organization.entity.Organization;

public class CustomUserDetails implements UserDetails {

private final String email;
private final String password;
private final String authority;

public CustomUserDetails(Group group) {
this.email = group.getEmail();
this.password = group.getPassword();
this.authority = group.getGroupType().toString();
public CustomUserDetails(Organization organization) {
this.email = organization.getEmail();
this.password = organization.getPassword();
this.authority = organization.getOrganizationType().toString();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.sponus.sponusbe.group.entity.Group;
import com.sponus.sponusbe.group.repository.GroupRepository;
import com.sponus.sponusbe.domain.organization.entity.Organization;
import com.sponus.sponusbe.domain.organization.repository.OrganizationRepository;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -16,14 +16,14 @@
@Slf4j
public class CustomUserDetailsService implements UserDetailsService {

private final GroupRepository groupRepository;
private final OrganizationRepository organizationRepository;

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
Group findGroup = groupRepository.findGroupByEmail(email);
Organization findOrganization = organizationRepository.findOrganizationByEmail(email);

log.info("[*] Group found : " + findGroup.getEmail());
log.info("[*] Organization found : " + findOrganization.getEmail());

return new CustomUserDetails(findGroup);
return new CustomUserDetails(findOrganization);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.sponus.sponusbe.domain.announcement.entity;

import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementCategory;
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementStatus;
import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType;
import com.sponus.sponusbe.domain.organization.entity.Organization;
import com.sponus.sponusbe.global.common.BaseEntity;

import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
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 lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Entity
@Table(name = "announcement")
public class Announcement extends BaseEntity {

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

@Column(name = "announcement_title")
private String title;

@Column(name = "announcement_type")
@Enumerated(EnumType.STRING)
private AnnouncementType type;

@Column(name = "announcement_category")
@Enumerated(EnumType.STRING)
private AnnouncementCategory category;

@Column(name = "announcement_content")
private String content;

@Column(name = "announcement_status")
@Enumerated(EnumType.STRING)
private AnnouncementStatus status;

@Column(name = "view_count")
private long viewCount;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Organization writer;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.sponus.sponusbe.domain.announcement.entity;

import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
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 lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Entity
@Table(name = "announcement_attachment")
public class AnnouncementAttachment {

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

@Column(name = "file_name")
private String name;

@Column(name = "file_url")
private String url;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "announcement_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Announcement announcement;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.sponus.sponusbe.domain.announcement.entity;

import jakarta.persistence.Column;
import jakarta.persistence.ConstraintMode;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.ForeignKey;
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 lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Getter
@Entity
@Table(name = "announcement_image")
public class AnnouncementImage {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "image_id")
private Long id;

@Column(name = "image_name")
private String name;

@Column(name = "image_url")
private String url;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "announcement_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
private Announcement announcement;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sponus.sponusbe.domain.announcement.entity.enums;

public enum AnnouncementCategory {
IDEA, MARKETING, DESIGN, DEVELOPMENT, OTHER
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sponus.sponusbe.domain.announcement.entity.enums;

public enum AnnouncementStatus {
POSTED, IN_PROGRESS, COMPLETED, CANCELLED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.sponus.sponusbe.domain.announcement.entity.enums;

public enum AnnouncementType {
SPONSORSHIP, PARTNERSHIP, COLLABORATION
}
Loading

0 comments on commit 1f208e3

Please sign in to comment.