Skip to content

Commit

Permalink
Merge pull request #68 from Team-Sopetit/feature/#62-profile-create-api
Browse files Browse the repository at this point in the history
[FEAT] 프로필 생성 API
  • Loading branch information
Chan531 authored Jan 11, 2024
2 parents 2f540d5 + f607eb2 commit 4531036
Show file tree
Hide file tree
Showing 15 changed files with 320 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.soptie.server.doll.service;

import com.soptie.server.doll.dto.DollImageResponse;
import com.soptie.server.doll.entity.Doll;
import com.soptie.server.doll.entity.DollType;

public interface DollService {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.soptie.server.member.controller;

import com.soptie.server.auth.message.ResponseMessage;
import com.soptie.server.common.dto.Response;
import com.soptie.server.member.dto.MemberProfileRequest;
import com.soptie.server.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;

import java.net.URI;
import java.security.Principal;

import static com.soptie.server.common.dto.Response.success;
import static com.soptie.server.member.message.ResponseMessage.SUCCESS_CREATE_PROFILE;

@RestController
@RequiredArgsConstructor
@RequestMapping("api/v1/members")
public class MemberController {

private final MemberService memberService;

@PostMapping
public ResponseEntity<Response> createMemberProfile(Principal principal, @RequestBody MemberProfileRequest request) {
val memberId = Long.parseLong(principal.getName());
memberService.createMemberProfile(memberId, request);
return ResponseEntity.created(getURI())
.body(success(SUCCESS_CREATE_PROFILE.getMessage(), null));
}

private URI getURI() {
return ServletUriComponentsBuilder
.fromCurrentRequest()
.path("/")
.buildAndExpand()
.toUri();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.soptie.server.member.dto;

import com.soptie.server.doll.entity.DollType;

import java.util.List;

public record MemberProfileRequest(
DollType dollType,
String name,
List<Long> routines
) {
}
4 changes: 4 additions & 0 deletions src/main/java/com/soptie/server/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ public Member(SocialType socialType, String socialId) {
this.cottonInfo = new Cotton(0, 0);
}

public void setMemberDoll(MemberDoll memberDoll) {
this.memberDoll = memberDoll;
}

public void initHappinessRoutine() {
this.happinessRoutine = null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ public enum ErrorMessage {
INVALID_MEMBER("유효하지 않은 회원입니다."),
INVALID_USERNAME("유효하지 않은 닉네임입니다."),
INACCESSIBLE_ROUTINE("회원의 루틴이 아닙니다."),
EXIST_PROFILE("프로필이 이미 존재합니다.")
;

private final String meesage;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.soptie.server.member.message;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public enum ResponseMessage {

SUCCESS_CREATE_PROFILE("프로필 생성 성공"),
;

private final String message;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.soptie.server.member.service;

import com.soptie.server.member.dto.MemberProfileRequest;

public interface MemberService {

void createMemberProfile(Long memberId, MemberProfileRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.soptie.server.member.service;

import com.soptie.server.member.dto.MemberProfileRequest;
import com.soptie.server.member.entity.Member;
import com.soptie.server.member.repository.MemberRepository;
import com.soptie.server.memberDoll.service.MemberDollService;
import com.soptie.server.memberRoutine.service.MemberDailyRoutineService;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Objects;

import static com.soptie.server.member.message.ErrorMessage.EXIST_PROFILE;
import static com.soptie.server.member.message.ErrorMessage.INVALID_MEMBER;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberServiceImpl implements MemberService {

private final MemberDollService memberDollService;
private final MemberDailyRoutineService memberDailyRoutineService;
private final MemberRepository memberRepository;

@Override
@Transactional
public void createMemberProfile(Long memberId, MemberProfileRequest request) {
val member = findMember(memberId);
checkMemberProfileExist(member);
memberDailyRoutineService.createMemberDailyRoutines(member, request.routines());
memberDollService.createMemberDoll(member, request.dollType(), request.name());
}

private Member findMember(Long id) {
return memberRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(INVALID_MEMBER.getMeesage()));
}

private void checkMemberProfileExist(Member member) {
if (Objects.nonNull(member)) {
throw new IllegalStateException(EXIST_PROFILE.getMeesage());
}
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/soptie/server/memberDoll/entity/MemberDoll.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,4 +34,16 @@ public class MemberDoll extends BaseTime {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "doll_id")
private Doll doll;

public MemberDoll(Member member, Doll doll, String name) {
this.happinessCottonCount = 0;
setMember(member);
this.doll = doll;
this.name = name;
}

private void setMember(Member member) {
this.member = member;
member.setMemberDoll(this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.soptie.server.memberDoll.repository;

import com.soptie.server.memberDoll.entity.MemberDoll;
import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberDollRepository extends JpaRepository<MemberDoll, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.soptie.server.memberDoll.service;

import com.soptie.server.doll.entity.DollType;
import com.soptie.server.member.entity.Member;

public interface MemberDollService {

void createMemberDoll(Member member, DollType dollType, String name);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.soptie.server.memberDoll.service;

import com.soptie.server.doll.entity.Doll;
import com.soptie.server.doll.entity.DollType;
import com.soptie.server.doll.repository.DollRepository;
import com.soptie.server.doll.service.DollService;
import com.soptie.server.member.entity.Member;
import com.soptie.server.memberDoll.entity.MemberDoll;
import com.soptie.server.memberDoll.repository.MemberDollRepository;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import lombok.val;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import static com.soptie.server.doll.message.ErrorMessage.INVALID_TYPE;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class MemberDollServiceImpl implements MemberDollService {

private final MemberDollRepository memberDollRepository;
private final DollRepository dollRepository;

@Override
@Transactional
public void createMemberDoll(Member member, DollType dollType, String name) {
val doll = getDoll(dollType);
val memberDoll = new MemberDoll(member, doll, name);
memberDollRepository.save(memberDoll);
}

private Doll getDoll(DollType type) {
return dollRepository.findByDollType(type)
.orElseThrow(() -> new EntityNotFoundException(INVALID_TYPE.getMessage()));
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
package com.soptie.server.memberRoutine.service;

import com.soptie.server.member.entity.Member;
import com.soptie.server.memberRoutine.dto.AchievedMemberDailyRoutineResponse;
import com.soptie.server.memberRoutine.dto.MemberDailyRoutineRequest;
import com.soptie.server.memberRoutine.dto.MemberDailyRoutineResponse;
import com.soptie.server.memberRoutine.dto.MemberDailyRoutinesResponse;

import java.util.List;

public interface MemberDailyRoutineService {
MemberDailyRoutineResponse createMemberDailyRoutine(long memberId, MemberDailyRoutineRequest request);
void createMemberDailyRoutines(Member member, List<Long> routines);
void deleteMemberDailyRoutine(long memberId, Long routineId);
AchievedMemberDailyRoutineResponse achieveMemberDailyRoutine(long memberId, Long routineId);
MemberDailyRoutinesResponse getMemberDailyRoutines(long memberId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import jakarta.persistence.EntityNotFoundException;
import lombok.*;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -42,6 +44,13 @@ public MemberDailyRoutineResponse createMemberDailyRoutine(long memberId, Member
return MemberDailyRoutineResponse.of(savedMemberRoutine.getId());
}

@Override
@Transactional
public void createMemberDailyRoutines(Member member, List<Long> routines) {
routines.forEach(routineId -> memberDailyRoutineRepository
.save(new MemberDailyRoutine(member, findRoutine(routineId))));
}

private DailyRoutine findRoutine(Long id) {
return dailyRoutineRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(INVALID_ROUTINE.getMessage()));
Expand Down
Loading

0 comments on commit 4531036

Please sign in to comment.