Skip to content

Commit 5af8586

Browse files
authored
v2.9.8
v2.9.8
2 parents b544900 + 0bf7e99 commit 5af8586

25 files changed

+756
-9
lines changed

main/build.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ dependencies {
3131
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
3232
implementation 'org.springframework.boot:spring-boot-starter-security'
3333

34+
//slack
35+
implementation 'com.slack.api:bolt:1.39.3'
36+
implementation 'com.slack.api:bolt-servlet:1.39.3'
37+
implementation 'com.slack.api:bolt-socket-mode:1.39.3'
38+
implementation 'com.slack.api:bolt-jetty:1.39.3'
39+
40+
// WebSocket
41+
implementation 'javax.websocket:javax.websocket-api:1.1'
42+
implementation 'org.glassfish.tyrus.bundles:tyrus-standalone-client:1.19'
43+
44+
3445
// Lombok Dependencies (Compile-time code generation library)
3546
compileOnly 'org.projectlombok:lombok'
3647
annotationProcessor 'org.projectlombok:lombok'
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package org.sopt.makers.crew.main.entity.slack;
2+
3+
import org.sopt.makers.crew.main.slack.dto.SlackEmojiEventDto;
4+
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.GeneratedValue;
8+
import jakarta.persistence.GenerationType;
9+
import jakarta.persistence.Id;
10+
import lombok.AccessLevel;
11+
import lombok.AllArgsConstructor;
12+
import lombok.Builder;
13+
import lombok.Getter;
14+
import lombok.NoArgsConstructor;
15+
16+
@Entity(name = "makers_user_slack")
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@AllArgsConstructor(access = AccessLevel.PRIVATE)
19+
@Getter
20+
@Builder
21+
public class MakersUserSlack {
22+
23+
@Id
24+
@GeneratedValue(strategy = GenerationType.IDENTITY)
25+
private Long id;
26+
27+
@Column(name = "username")
28+
private String username; // 이름
29+
30+
@Column(name = "user_slack_id")
31+
private String userSlackId; // 유저 slack Id
32+
33+
@Column(name = "team")
34+
private String team; // 유저 팀
35+
36+
@Column(name = "generation")
37+
private Integer generation; // 기수
38+
39+
@Column(name = "call_emoji")
40+
private String callEmoji; // 호출 이모지
41+
42+
@Column(name = "slack_message_template_cd")
43+
private String slackTemplateCd;
44+
45+
public static MakersUserSlack create(SlackEmojiEventDto dto) {
46+
return MakersUserSlack.builder()
47+
.username(dto.getUsername())
48+
.userSlackId(dto.getUserSlackId())
49+
.team(dto.getTeam())
50+
.generation(dto.getGeneration())
51+
.callEmoji(dto.getCallEmoji())
52+
.slackTemplateCd(dto.getTemplateCd())
53+
.build();
54+
}
55+
56+
public void updateEmoji(String callEmoji) {
57+
this.callEmoji = callEmoji;
58+
}
59+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.sopt.makers.crew.main.entity.slack;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.data.jpa.repository.Modifying;
8+
import org.springframework.data.jpa.repository.Query;
9+
import org.springframework.data.repository.query.Param;
10+
11+
public interface MakersUserSlackRepository extends JpaRepository<MakersUserSlack, Long> {
12+
13+
Optional<MakersUserSlack> findByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
14+
15+
@Query("select m from makers_user_slack m where m.callEmoji = :emoji")
16+
List<MakersUserSlack> findByCallEmoji(@Param("emoji") String emoji);
17+
18+
@Modifying
19+
void deleteByCallEmoji(String callEmoji);
20+
21+
boolean existsByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
22+
23+
@Modifying
24+
void deleteByCallEmojiAndUserSlackId(String callEmoji, String userSlackId);
25+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package org.sopt.makers.crew.main.entity.slack;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.Id;
6+
import lombok.AccessLevel;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Entity(name = "slack_message_template")
11+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
12+
@Getter
13+
public class SlackMessageTemplate {
14+
15+
@Id
16+
@Column(name = "template_cd")
17+
private String templateCd;
18+
19+
@Column(name = "template_content")
20+
private String templateContent;
21+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package org.sopt.makers.crew.main.entity.slack;
2+
3+
import java.util.Optional;
4+
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface SlackMessageTemplateRepository extends JpaRepository<SlackMessageTemplate, String> {
8+
Optional<SlackMessageTemplate> findByTemplateCd(String templateCd);
9+
}

main/src/main/java/org/sopt/makers/crew/main/global/config/SecurityConfig.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,6 @@
2626
@RequiredArgsConstructor
2727
@EnableWebSecurity
2828
public class SecurityConfig {
29-
private final JwtAuthenticationFilter jwtAuthenticationFilter;
30-
private final JwtAuthenticationExceptionFilter jwtAuthenticationExceptionFilter;
31-
32-
@Value("${management.endpoints.web.base-path}")
33-
private String actuatorEndPoint;
34-
3529
private static final String[] SWAGGER_URL = {
3630
"/swagger-resources/**",
3731
"/favicon.ico",
@@ -42,6 +36,10 @@ public class SecurityConfig {
4236
"/docs/swagger-ui/index.html",
4337
"/swagger-ui/swagger-ui.css",
4438
};
39+
private final JwtAuthenticationFilter jwtAuthenticationFilter;
40+
private final JwtAuthenticationExceptionFilter jwtAuthenticationExceptionFilter;
41+
@Value("${management.endpoints.web.base-path}")
42+
private String actuatorEndPoint;
4543

4644
private String[] getAuthWhitelist() {
4745
return new String[] {
@@ -54,7 +52,8 @@ private String[] getAuthWhitelist() {
5452
actuatorEndPoint + "/caches/**",
5553
actuatorEndPoint + "/cachecontents/**",
5654
actuatorEndPoint + "/metrics/**",
57-
"/internal/**"
55+
"/internal/**",
56+
"/slack/**"
5857
};
5958
}
6059

@@ -87,7 +86,7 @@ CorsConfigurationSource corsConfigurationSource() {
8786
configuration.setAllowedOrigins(List.of(
8887
"https://playground.sopt.org",
8988
"http://localhost:3000",
90-
"https://sopt-internal-dev.pages.dev",
89+
"https://sopt-internal-dev.sopt.org",
9190
"https://crew.api.dev.sopt.org",
9291
"https://crew.api.prod.sopt.org"
9392
));
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package org.sopt.makers.crew.main.global.exception;
2+
3+
public class CustomSlackException extends RuntimeException {
4+
public CustomSlackException() {
5+
super();
6+
}
7+
8+
public CustomSlackException(String message) {
9+
super(message);
10+
}
11+
}

main/src/main/java/org/sopt/makers/crew/main/post/v2/PostV2Api.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2ReportResponseDto;
1414
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2SwitchPostLikeResponseDto;
1515
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2UpdatePostResponseDto;
16+
import org.sopt.makers.crew.main.post.v2.dto.response.PostViewCountResponseDto;
1617
import org.springframework.http.ResponseEntity;
1718
import org.springframework.web.bind.annotation.ModelAttribute;
1819
import org.springframework.web.bind.annotation.PathVariable;
@@ -85,4 +86,8 @@ ResponseEntity<PostV2UpdatePostResponseDto> updatePost(@PathVariable Integer pos
8586
@Operation(summary = "모임 게시글 좋아요 토글")
8687
@ApiResponse(responseCode = "201", description = "성공")
8788
ResponseEntity<PostV2SwitchPostLikeResponseDto> switchPostLike(@PathVariable Integer postId, Principal principal);
89+
90+
@Operation(summary = "모임 게시글 조회수 증가")
91+
@ApiResponse(responseCode = "200", description = "성공, 응답 : 조회수")
92+
ResponseEntity<PostViewCountResponseDto> addViewCount(@PathVariable Integer postId, Principal principal);
8893
}

main/src/main/java/org/sopt/makers/crew/main/post/v2/PostV2Controller.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2ReportResponseDto;
1515
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2SwitchPostLikeResponseDto;
1616
import org.sopt.makers.crew.main.post.v2.dto.response.PostV2UpdatePostResponseDto;
17+
import org.sopt.makers.crew.main.post.v2.dto.response.PostViewCountResponseDto;
1718
import org.sopt.makers.crew.main.post.v2.service.PostV2Service;
1819
import org.springframework.http.HttpStatus;
1920
import org.springframework.http.ResponseEntity;
@@ -77,6 +78,13 @@ public ResponseEntity<PostDetailBaseDto> getPost(@PathVariable Integer postId, P
7778
return ResponseEntity.ok(postV2Service.getPost(userId, postId));
7879
}
7980

81+
@Override
82+
@PostMapping("/{postId}/views")
83+
@ResponseStatus(HttpStatus.OK)
84+
public ResponseEntity<PostViewCountResponseDto> addViewCount(@PathVariable Integer postId, Principal principal) {
85+
return ResponseEntity.ok(postV2Service.addViewCount(postId));
86+
}
87+
8088
@Override
8189
@GetMapping("/count")
8290
@ResponseStatus(HttpStatus.OK)
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package org.sopt.makers.crew.main.post.v2.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@Schema(name = "PostViewCountResponseDto", description = "게시글 조회수 증가용 api 응답 Dto")
10+
@AllArgsConstructor
11+
public class PostViewCountResponseDto {
12+
13+
@Schema(description = "게시글 조회수", example = "30")
14+
@NotNull
15+
private final int viewCount;
16+
17+
public static PostViewCountResponseDto of(int viewCount) {
18+
return new PostViewCountResponseDto(viewCount);
19+
}
20+
}

0 commit comments

Comments
 (0)