Skip to content

Commit cce98f2

Browse files
authored
Merge pull request #26 from GDSCINHA/develop
[FEAT] 동아리 박람회 게임 관련 api 구현
2 parents 89220d1 + 4040e38 commit cce98f2

File tree

15 files changed

+331
-0
lines changed

15 files changed

+331
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package inha.gdgoc.domain.game.controller;
2+
3+
import inha.gdgoc.domain.game.dto.request.GameQuestionRequest;
4+
import inha.gdgoc.domain.game.dto.response.GameQuestionResponse;
5+
import inha.gdgoc.domain.game.entity.GameQuestion;
6+
import inha.gdgoc.domain.game.service.GameQuestionService;
7+
import inha.gdgoc.global.common.ApiResponse;
8+
import java.util.List;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.RequestBody;
14+
import org.springframework.web.bind.annotation.RestController;
15+
16+
@RequiredArgsConstructor
17+
@RestController
18+
public class GameQuestionController {
19+
20+
private final GameQuestionService gameQuestionService;
21+
22+
@PostMapping("/game/question")
23+
public ResponseEntity<ApiResponse<GameQuestionRequest>> saveQuestion(
24+
@RequestBody GameQuestionRequest gameQuestionRequest) {
25+
gameQuestionService.saveQuestion(gameQuestionRequest);
26+
27+
return ResponseEntity.ok(ApiResponse.success(null));
28+
}
29+
30+
@GetMapping("/game/questions")
31+
public ResponseEntity<ApiResponse<List<GameQuestionResponse>>> getRandomGameQuestions() {
32+
return ResponseEntity.ok(ApiResponse.success(gameQuestionService.getRandomQuestionsByLanguage()));
33+
}
34+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package inha.gdgoc.domain.game.controller;
2+
3+
import inha.gdgoc.domain.game.dto.request.GameUserRequest;
4+
import inha.gdgoc.domain.game.dto.response.GameUserResponse;
5+
import inha.gdgoc.domain.game.entity.GameUser;
6+
import inha.gdgoc.domain.game.service.GameUserService;
7+
import inha.gdgoc.global.common.ApiResponse;
8+
import java.util.List;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.web.bind.annotation.PostMapping;
12+
import org.springframework.web.bind.annotation.RequestBody;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
@RequiredArgsConstructor
16+
@RestController
17+
public class GameUserController {
18+
19+
private final GameUserService gameUserService;
20+
21+
@PostMapping("/game/result")
22+
public ResponseEntity<ApiResponse<List<GameUserResponse>>> saveGameResult(@RequestBody GameUserRequest request) {
23+
return ResponseEntity.ok(ApiResponse.success(gameUserService.saveGameResultAndGetRanking(request)));
24+
}
25+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package inha.gdgoc.domain.game.dto.request;
2+
3+
import inha.gdgoc.domain.game.entity.GameQuestion;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@NoArgsConstructor
8+
@Getter
9+
public class GameQuestionRequest {
10+
private String language;
11+
private String content;
12+
13+
public GameQuestion toEntity() {
14+
return GameQuestion.builder()
15+
.language(language)
16+
.content(content)
17+
.build();
18+
}
19+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package inha.gdgoc.domain.game.dto.request;
2+
3+
import inha.gdgoc.domain.game.entity.GameUser;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
@Getter
8+
@NoArgsConstructor
9+
public class GameUserRequest {
10+
private String name;
11+
private String major;
12+
private String studentId;
13+
private String phoneNumber;
14+
private double typingSpeed;
15+
16+
public GameUser toEntity() {
17+
return GameUser.builder()
18+
.name(name)
19+
.major(major)
20+
.studentId(studentId)
21+
.phoneNumber(phoneNumber)
22+
.typingSpeed(typingSpeed)
23+
.build();
24+
}
25+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package inha.gdgoc.domain.game.dto.response;
2+
3+
import inha.gdgoc.domain.game.entity.GameQuestion;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class GameQuestionResponse {
8+
9+
private Long id;
10+
private String language;
11+
private String content;
12+
13+
public GameQuestionResponse(GameQuestion gameQuestion) {
14+
this.id = gameQuestion.getId();
15+
this.language = gameQuestion.getLanguage();
16+
this.content = gameQuestion.getContent();
17+
}
18+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package inha.gdgoc.domain.game.dto.response;
2+
3+
import inha.gdgoc.domain.game.entity.GameUser;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class GameUserResponse {
8+
private Long id;
9+
private int rank;
10+
private String name;
11+
private String major;
12+
private double typingSpeed;
13+
14+
public GameUserResponse(int rank, GameUser gameUser) {
15+
this.id = gameUser.getId();
16+
this.rank = rank;
17+
this.name = gameUser.getName();
18+
this.major = gameUser.getMajor();
19+
this.typingSpeed = gameUser.getTypingSpeed();
20+
}
21+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package inha.gdgoc.domain.game.entity;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import lombok.AccessLevel;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Builder;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
14+
@Entity
15+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
16+
@AllArgsConstructor
17+
@Getter
18+
@Builder
19+
public class GameQuestion {
20+
21+
@Id
22+
@GeneratedValue(strategy = GenerationType.IDENTITY)
23+
@Column(name = "id")
24+
private Long id;
25+
26+
@Column(name = "language", nullable = false)
27+
private String language;
28+
29+
@Column(nullable = false, columnDefinition = "TEXT")
30+
private String content;
31+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package inha.gdgoc.domain.game.entity;
2+
3+
import inha.gdgoc.global.common.BaseEntity;
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.GeneratedValue;
7+
import jakarta.persistence.GenerationType;
8+
import jakarta.persistence.Id;
9+
import lombok.AccessLevel;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Builder;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Entity
16+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
17+
@AllArgsConstructor
18+
@Getter
19+
@Builder
20+
public class GameUser extends BaseEntity {
21+
22+
@Id
23+
@GeneratedValue(strategy = GenerationType.IDENTITY)
24+
@Column(name = "id")
25+
private Long id;
26+
27+
@Column(name = "name", nullable = false)
28+
private String name;
29+
30+
@Column(name = "major", nullable = false)
31+
private String major;
32+
33+
@Column(name = "student_id", nullable = false)
34+
private String studentId;
35+
36+
@Column(name = "phone_number", nullable = false)
37+
private String phoneNumber;
38+
39+
@Column(name = "typing_speed", nullable = false)
40+
private double typingSpeed;
41+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package inha.gdgoc.domain.game.repository;
2+
3+
import inha.gdgoc.domain.game.entity.GameQuestion;
4+
import java.util.List;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface GameQuestionRepository extends JpaRepository<GameQuestion, Long> {
8+
List<GameQuestion> findByLanguage(String language);
9+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package inha.gdgoc.domain.game.repository;
2+
3+
import inha.gdgoc.domain.game.entity.GameUser;
4+
import java.time.LocalDateTime;
5+
import java.util.List;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
8+
public interface GameUserRepository extends JpaRepository<GameUser, Long> {
9+
List<GameUser> findAllByCreatedAtBetweenOrderByTypingSpeedAsc(LocalDateTime startOfDay, LocalDateTime endOfDay);
10+
}

0 commit comments

Comments
 (0)