Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 24 additions & 52 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,71 +1,43 @@
plugins {
id 'java'
id 'org.springframework.boot' version '3.5.10'
id 'io.spring.dependency-management' version '1.1.7'
id 'org.asciidoctor.jvm.convert' version '4.0.5'
id 'java'
id 'org.springframework.boot' version '3.5.9'
id 'io.spring.dependency-management' version '1.1.7'
}

group = 'com.spring-study'
group = 'com.example'
version = '0.0.1-SNAPSHOT'
description = '์ฑ„ํŒ… ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜'
description = 'chatting'

java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}

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

repositories {
mavenCentral()
}

ext {
set('snippetsDir', file("build/generated-snippets"))
set('springCloudVersion', "2025.0.1")
set('tanzuScgExtensionsVersion', "1.0.1")
mavenCentral()
}

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
implementation 'com.vmware.tanzu.springcloudgateway.extensions:access-control'
implementation 'org.springframework.cloud:spring-cloud-starter-gateway-server-webflux'
compileOnly 'org.projectlombok:lombok'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.boot:spring-boot-testcontainers'
testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc'
testImplementation 'org.springframework.security:spring-security-test'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mysql'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

dependencyManagement {
imports {
mavenBom "com.vmware.tanzu.springcloudgateway.extensions:extensions-bom:${tanzuScgExtensionsVersion}"
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.mysql:mysql-connector-j'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5'
}

tasks.named('test') {
outputs.dir snippetsDir
useJUnitPlatform()
}

tasks.named('asciidoctor') {
inputs.dir snippetsDir
dependsOn test
useJUnitPlatform()
}
1 change: 1 addition & 0 deletions chatting
Submodule chatting added at 6208fa
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Expand Down
5 changes: 1 addition & 4 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions src/main/java/com/example/chatting/ChattingApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.chatting;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ChattingApplication {

public static void main(String[] args) {
SpringApplication.run(ChattingApplication.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.example.chatting.controller;

import com.example.chatting.domain.enums.FriendEnum;
import com.example.chatting.dto.response.FriendListResponseDto;
import com.example.chatting.service.FriendService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@RequiredArgsConstructor
@RestController
@RequestMapping("/friends")
public class FriendController {
private final FriendService friendService;

@GetMapping("")
public ResponseEntity<List<FriendListResponseDto>> getFriendList(UUID uid) {
return ResponseEntity.ok(friendService.getFriendList(uid));
}

@GetMapping("/{name}")
public ResponseEntity<List<FriendListResponseDto>> searchFriend(@PathVariable String name, UUID uid) {
return ResponseEntity.ok(friendService.searchFriend(uid, name));
}

@PatchMapping("/{id}/block")
public ResponseEntity<FriendListResponseDto> blockFriend(@PathVariable UUID id, UUID uid) {
return ResponseEntity.ok(friendService.blockFriend(uid, id));
}

@PatchMapping("/{id}/hide")
public ResponseEntity<FriendListResponseDto> hideFriend(@PathVariable UUID id, UUID uid) {
return ResponseEntity.ok(friendService.hideFriend(uid, id));
}

@GetMapping("/blacklist")
public ResponseEntity<List<FriendListResponseDto>> getBlockFriendList(UUID uid) {
return ResponseEntity.ok(friendService.getBlockFriendList(uid));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.example.chatting.controller;

import com.example.chatting.domain.FriendRequest;
import com.example.chatting.domain.enums.FriendRequestEnum;
import com.example.chatting.dto.request.FriendRequestDto;
import com.example.chatting.dto.response.FriendRequestResponseDto;
import com.example.chatting.service.FriendRequestService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.UUID;

@RequiredArgsConstructor
@RestController
@RequestMapping("/friend-requests")
public class FriendRequestController {
private final FriendRequestService friendRequestService;

@PostMapping("")
public ResponseEntity<String> sendFriend(@RequestBody FriendRequestDto friendRequestDto, UUID uid){
friendRequestService.sendFriend(uid, friendRequestDto);
return ResponseEntity.ok("์นœ๊ตฌ ์š”์ฒญ ์ „์†ก ์„ฑ๊ณต");
}

@GetMapping("")
public ResponseEntity<List<FriendRequestResponseDto>> requestFriendList(UUID uid) {
return ResponseEntity.ok(friendRequestService.requestFriendList(uid));
}

@PatchMapping("/{requestId}/accept")
public ResponseEntity<String> acceptRequest(@PathVariable Long requestId, UUID uid) {
friendRequestService.acceptRequest(uid, requestId, FriendRequestEnum.ACCEPT);
return ResponseEntity.ok("์นœ๊ตฌ ์š”์ฒญ ์ˆ˜๋ฝ");
}

@PatchMapping("/{requestId}/decline")
public ResponseEntity<String> declineRequest(@PathVariable Long requestId, UUID uid) {
friendRequestService.acceptRequest(uid, requestId, FriendRequestEnum.DECLINE);
return ResponseEntity.ok("์นœ๊ตฌ ์š”์ฒญ ๊ฑฐ์ ˆ");
}

}
52 changes: 52 additions & 0 deletions src/main/java/com/example/chatting/domain/Friend.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.example.chatting.domain;


import com.example.chatting.domain.enums.FriendEnum;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicUpdate;

import java.time.LocalDate;

@Entity
@Table(name = "friend")
@NoArgsConstructor
@Getter
@DynamicUpdate
@Builder
@AllArgsConstructor
public class Friend {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne
@JoinColumn(name = "uid", nullable = false)
private User uid;

@ManyToOne
@JoinColumn(name = "fid", nullable = false)
private User fid;

@Column(name = "created_at")
private LocalDate createdAt;

@Enumerated(EnumType.STRING)
private FriendEnum status;

public Friend(User uid, User fid, LocalDate createdAt, FriendEnum status) {
this.uid = uid;
this.fid = fid;
this.createdAt = createdAt;
this.status = status;
}

public void updateStatus(FriendEnum status) {
this.status = status;
}
}

48 changes: 48 additions & 0 deletions src/main/java/com/example/chatting/domain/FriendRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.example.chatting.domain;

import com.example.chatting.domain.enums.FriendEnum;
import com.example.chatting.domain.enums.FriendRequestEnum;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Entity
@Table(name = "friend_request")
@Getter
@NoArgsConstructor
@Builder
@AllArgsConstructor
public class FriendRequest {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne
@JoinColumn(name = "requester", nullable = false)
private User requester; //์š”์ฒญ ๋ณด๋‚ธ ์‚ฌ๋žŒ

@ManyToOne
@JoinColumn(name = "respondent", nullable = false)
private User respondent; //์š”์ฒญ ๋ฐ›๋Š” ์‚ฌ๋žŒ

@Enumerated(EnumType.STRING)
private FriendRequestEnum status;

@Column(name = "created_at")
private LocalDate createdAt;

public FriendRequest(LocalDate createdAt, FriendRequestEnum status, User respondent, User requester) {
this.createdAt = createdAt;
this.status = status;
this.respondent = respondent;
this.requester = requester;
}

public void updateStatus(FriendRequestEnum status) {
this.status = status;
}
}
Loading