Skip to content

Commit fdaf6eb

Browse files
committed
feat: petAPI구현
1 parent f35ddd4 commit fdaf6eb

File tree

10 files changed

+243
-0
lines changed

10 files changed

+243
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package cmf.commitField.domain.pet.controller;
2+
3+
import cmf.commitField.domain.pet.entity.Pet;
4+
import cmf.commitField.domain.pet.service.PetService;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.*;
7+
8+
import java.util.List;
9+
10+
@RestController
11+
@RequiredArgsConstructor
12+
@RequestMapping("/pets")
13+
public class PetController {
14+
15+
private final PetService petService;
16+
17+
// 새로운 펫 추가
18+
@PostMapping
19+
public Pet createPet(@RequestParam String name, @RequestParam String imageUrl) {
20+
return petService.createPet(name, imageUrl);
21+
}
22+
23+
// 모든 펫 조회
24+
@GetMapping
25+
public List<Pet> getAllPets() {
26+
return petService.getAllPets();
27+
}
28+
29+
// 특정 펫 조회
30+
@GetMapping("/{petId}")
31+
public Pet getPetById(@PathVariable Long petId) {
32+
return petService.getPetById(petId);
33+
}
34+
35+
// 펫 삭제
36+
@DeleteMapping("/{petId}")
37+
public void deletePet(@PathVariable Long petId) {
38+
petService.deletePet(petId);
39+
}
40+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cmf.commitField.domain.pet.controller;
2+
3+
4+
import cmf.commitField.domain.pet.entity.Pet;
5+
import cmf.commitField.domain.pet.entity.UserPet;
6+
import cmf.commitField.domain.pet.service.PetService;
7+
import cmf.commitField.domain.pet.service.UserPetService;
8+
import cmf.commitField.domain.user.entity.User;
9+
import cmf.commitField.domain.user.service.CustomOAuth2UserService;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import java.util.List;
14+
15+
@RestController
16+
@RequestMapping("/user-pets")
17+
@RequiredArgsConstructor
18+
public class UserPetController {
19+
20+
private final UserPetService userPetService;
21+
private final CustomOAuth2UserService customOAuth2UserService;
22+
private final PetService petService;
23+
24+
// 유저가 펫을 부화
25+
@PostMapping("/hatch")
26+
public UserPet hatchPet(@RequestParam Long userId, @RequestParam Long petId) {
27+
User user = customOAuth2UserService.getUserById(userId).orElse(null);
28+
Pet pet = petService.getPetById(petId);
29+
return userPetService.hatchPet(user, pet);
30+
}
31+
32+
// 유저의 도감 조회 (보유한 펫 목록)
33+
@GetMapping("/collection/{userId}")
34+
public List<Pet> getUserPetCollection(@PathVariable Long userId) {
35+
User user = customOAuth2UserService.getUserById(userId).orElse(null);
36+
return userPetService.getUserPetCollection(user);
37+
}
38+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cmf.commitField.domain.pet.entity;
2+
3+
import cmf.commitField.global.jpa.BaseEntity;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.Table;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
import lombok.Setter;
10+
import lombok.experimental.SuperBuilder;
11+
12+
@Entity
13+
@Getter
14+
@Setter
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
@SuperBuilder
18+
@Table(name = "pet")
19+
public class Pet extends BaseEntity {
20+
private String name;
21+
private String imageUrl;
22+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package cmf.commitField.domain.pet.entity;
2+
3+
import cmf.commitField.domain.user.entity.User;
4+
import cmf.commitField.global.jpa.BaseEntity;
5+
import jakarta.persistence.Entity;
6+
import jakarta.persistence.JoinColumn;
7+
import jakarta.persistence.ManyToOne;
8+
import jakarta.persistence.Table;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
import lombok.Setter;
13+
import lombok.experimental.SuperBuilder;
14+
15+
@Entity
16+
@Getter
17+
@Setter
18+
@NoArgsConstructor
19+
@AllArgsConstructor
20+
@SuperBuilder
21+
@Table(name = "user_pet")
22+
public class UserPet extends BaseEntity {
23+
24+
@ManyToOne
25+
@JoinColumn(name = "user_id")
26+
private User user;
27+
28+
@ManyToOne
29+
@JoinColumn(name = "pet_id")
30+
private Pet pet;
31+
32+
private boolean isHatched; // 부화 여부
33+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cmf.commitField.domain.pet.repository;
2+
3+
import cmf.commitField.domain.pet.entity.Pet;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.Optional;
8+
9+
@Repository
10+
public interface PetRepository extends JpaRepository<Pet, Long> {
11+
Optional<Pet> findById(Long id);
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cmf.commitField.domain.pet.repository;
2+
3+
import cmf.commitField.domain.pet.entity.Pet;
4+
import cmf.commitField.domain.pet.entity.UserPet;
5+
import cmf.commitField.domain.user.entity.User;
6+
import org.springframework.data.jpa.repository.JpaRepository;
7+
import org.springframework.stereotype.Repository;
8+
9+
import java.util.List;
10+
11+
@Repository
12+
public interface UserPetRepository extends JpaRepository<UserPet, Long> {
13+
List<UserPet> findByUser(User user);
14+
boolean existsByUserAndPet(User user, Pet pet);
15+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package cmf.commitField.domain.pet.service;
2+
3+
import cmf.commitField.domain.pet.entity.Pet;
4+
import cmf.commitField.domain.pet.repository.PetRepository;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Service;
7+
8+
import java.util.List;
9+
import java.util.Optional;
10+
11+
@Service
12+
@RequiredArgsConstructor
13+
public class PetService {
14+
15+
private final PetRepository petRepository;
16+
17+
// 새로운 펫 생성
18+
public Pet createPet(String name, String imageUrl) {
19+
Pet pet = new Pet(name, imageUrl);
20+
return petRepository.save(pet);
21+
}
22+
23+
// 모든 펫 조회
24+
public List<Pet> getAllPets() {
25+
return petRepository.findAll();
26+
}
27+
28+
// 특정 펫 조회
29+
public Pet getPetById(Long petId) {
30+
Optional<Pet> pet = petRepository.findById(petId);
31+
return pet.orElse(null);
32+
}
33+
34+
// 펫 삭제
35+
public void deletePet(Long petId) {
36+
petRepository.deleteById(petId);
37+
}
38+
39+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package cmf.commitField.domain.pet.service;
2+
3+
import cmf.commitField.domain.pet.entity.Pet;
4+
import cmf.commitField.domain.pet.entity.UserPet;
5+
import cmf.commitField.domain.pet.repository.UserPetRepository;
6+
import cmf.commitField.domain.user.entity.User;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.stereotype.Service;
9+
10+
import java.util.List;
11+
import java.util.stream.Collectors;
12+
13+
@Service
14+
@RequiredArgsConstructor
15+
public class UserPetService {
16+
17+
private final UserPetRepository userPetRepository;
18+
19+
// 유저가 펫을 부화
20+
public UserPet hatchPet(User user, Pet pet) {
21+
// 기존에 같은 펫을 부화한 적이 있는지 확인
22+
boolean alreadyHatched = userPetRepository.existsByUserAndPet(user, pet);
23+
24+
if (!alreadyHatched) {
25+
UserPet userPet = new UserPet(user, pet, true);
26+
return userPetRepository.save(userPet);
27+
}
28+
return null; // 이미 부화한 펫이면 저장하지 않음
29+
}
30+
31+
// 유저의 도감 조회 (보유한 펫 목록)
32+
public List<Pet> getUserPetCollection(User user) {
33+
List<UserPet> userPets = userPetRepository.findByUser(user);
34+
return userPets.stream()
35+
.map(UserPet::getPet) // UserPet에서 Pet만 추출
36+
.collect(Collectors.toList());
37+
}
38+
}

src/main/java/cmf/commitField/domain/user/repository/UserRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77

88
public interface UserRepository extends JpaRepository<User, Long> {
99
Optional<User> findByUsername(String username);
10+
Optional<User> findById(Long id);
1011
}

src/main/java/cmf/commitField/domain/user/service/CustomOAuth2UserService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,9 @@ public OAuth2User loadUser(OAuth2UserRequest userRequest) {
4747

4848
return new CustomOAuth2User(oauthUser, user);
4949
}
50+
51+
// id로 user 조회
52+
public Optional<User> getUserById(Long userId) {
53+
return userRepository.findById(userId);
54+
}
5055
}

0 commit comments

Comments
 (0)