Skip to content

Commit

Permalink
[MERGE/#68] 선배 프로필 등록 구현
Browse files Browse the repository at this point in the history
[FEAT] #68 - 선배 프로필 등록 구현
  • Loading branch information
seokbeom00 authored Jul 12, 2024
2 parents 4d045c0 + 2409bc1 commit 75028fa
Show file tree
Hide file tree
Showing 17 changed files with 195 additions and 59 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.sopt.seonyakServer.domain.appointment.model;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
Expand All @@ -17,9 +16,10 @@
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import org.sopt.seonyakServer.domain.member.model.Member;
import org.sopt.seonyakServer.domain.senior.model.Senior;
import org.sopt.seonyakServer.domain.util.JsonConverter;


@Entity
Expand All @@ -42,7 +42,7 @@ public class Appointment {
private Senior senior;

@Column(name = "time_list", columnDefinition = "jsonb", nullable = false)
@Convert(converter = JsonConverter.class)
@JdbcTypeCode(SqlTypes.JSON)
private Map<String, Object> timeList;

@Column(name = "topic")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.sopt.seonyakServer.domain.senior.controller;

import lombok.RequiredArgsConstructor;
import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileRequest;
import org.sopt.seonyakServer.domain.senior.service.SeniorService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/senior")
public class SeniorController {

private final SeniorService seniorService;

@PatchMapping("/profile")
public ResponseEntity<Void> patchProfile(
@RequestBody final SeniorProfileRequest seniorProfileRequest
) {
seniorService.patchSeniorProfile(seniorProfileRequest);
return ResponseEntity.ok().build();
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.sopt.seonyakServer.domain.senior.dto;

import org.sopt.seonyakServer.domain.senior.model.PreferredTimeList;

public record SeniorProfileRequest(
String catchphrase,
String career,
String award,
String story,
PreferredTimeList preferredTimeList
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.sopt.seonyakServer.domain.senior.model;

import com.fasterxml.jackson.annotation.JsonAnySetter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class PreferredTimeList {
private Map<String, List<TimeRange>> preferredTimeList = new HashMap<>();

@JsonAnySetter
public void setPreferredTime(String day, List<TimeRange> times) {
preferredTimeList.put(day, times);
}

}
Original file line number Diff line number Diff line change
@@ -1,21 +1,20 @@
package org.sopt.seonyakServer.domain.senior.model;

import jakarta.persistence.Column;
import jakarta.persistence.Convert;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import java.util.Map;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.JdbcTypeCode;
import org.hibernate.type.SqlTypes;
import org.sopt.seonyakServer.domain.member.model.Member;
import org.sopt.seonyakServer.domain.util.JsonConverter;
import org.sopt.seonyakServer.global.common.model.BaseTimeEntity;

@Entity
Expand Down Expand Up @@ -46,7 +45,7 @@ public class Senior extends BaseTimeEntity {
private String detailPosition;

@Column(name = "level", nullable = false)
private int level;
private String level;

@Column(name = "catchphrase")
private String catchphrase;
Expand All @@ -60,45 +59,56 @@ public class Senior extends BaseTimeEntity {
@Column(name = "story")
private String story;

@Column(name = "is_day_of_week", nullable = false)
private Boolean isDayOfWeek;

@Column(name = "preferred_time_list", columnDefinition = "jsonb")
@Convert(converter = JsonConverter.class)
private Map<String, Object> preferredTimeList;
@Column(name = "preferred_time_list", columnDefinition = "json")
@JdbcTypeCode(SqlTypes.JSON)
private PreferredTimeList preferredTimeList;

@Builder(access = AccessLevel.PRIVATE)
private Senior(
Member member,
String businessCard,
String detailPosition,
int level,
Boolean isDayOfWeek,
Map<String, Object> preferredTimeList
String company,
String position,
String level
) {
this.member = member;
this.businessCard = businessCard;
this.detailPosition = detailPosition;
this.company = company;
this.position = position;
this.level = level;
this.isDayOfWeek = isDayOfWeek;
this.preferredTimeList = preferredTimeList;
}

public static Senior createSenior(
Member member,
String businessCard,
String detailPosition,
int level,
Boolean isDayOfWeek,
Map<String, Object> preferredTimeList
String company,
String position,
String level
) {
return Senior.builder()
.member(member)
.businessCard(businessCard)
.detailPosition(detailPosition)
.company(company)
.position(position)
.level(level)
.isDayOfWeek(isDayOfWeek)
.preferredTimeList(preferredTimeList)
.build();
}

public void updateSenior(
String catchphrase,
String career,
String award,
String story,
PreferredTimeList preferredTimeList
) {
this.catchphrase = catchphrase;
this.career = career;
this.award = award;
this.story = story;
this.preferredTimeList = preferredTimeList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.sopt.seonyakServer.domain.senior.model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class TimeRange {
private String startTime;
private String endTime;
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.sopt.seonyakServer.domain.senior.repository;

import java.util.Optional;
import org.sopt.seonyakServer.domain.senior.model.Senior;
import org.sopt.seonyakServer.global.exception.enums.ErrorType;
import org.sopt.seonyakServer.global.exception.model.CustomException;
import org.springframework.data.jpa.repository.JpaRepository;

public interface SeniorRepository extends JpaRepository<Senior, Long> {

Optional<Senior> findSeniorById(Long id);

Optional<Senior> findSeniorByMemberId(Long id);

default Senior findSeniorByIdOrThrow(Long id) {
return findSeniorById(id)
.orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_MEMBER_ERROR));
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.sopt.seonyakServer.domain.senior.service;

import lombok.RequiredArgsConstructor;
import org.sopt.seonyakServer.domain.senior.dto.SeniorProfileRequest;
import org.sopt.seonyakServer.domain.senior.model.Senior;
import org.sopt.seonyakServer.domain.senior.repository.SeniorRepository;
import org.sopt.seonyakServer.global.auth.PrincipalHandler;
import org.sopt.seonyakServer.global.exception.enums.ErrorType;
import org.sopt.seonyakServer.global.exception.model.CustomException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class SeniorService {

private final SeniorRepository seniorRepository;
private final PrincipalHandler principalHandler;

public void patchSeniorProfile(SeniorProfileRequest seniorProfileRequest) {
Senior senior = seniorRepository.findSeniorByMemberId(principalHandler.getUserIdFromPrincipal())
.orElseThrow(() -> new CustomException(ErrorType.NOT_FOUND_SENIOR_BY_MEMBER));

senior.updateSenior(
seniorProfileRequest.catchphrase(),
seniorProfileRequest.career(),
seniorProfileRequest.award(),
seniorProfileRequest.story(),
seniorProfileRequest.preferredTimeList()
);
seniorRepository.save(senior);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.sopt.seonyakServer.global.auth;

import org.sopt.seonyakServer.global.exception.enums.ErrorType;
import org.sopt.seonyakServer.global.exception.model.CustomException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;

@Component
public class PrincipalHandler {

private static final String ANONYMOUS_USER = "anonymousUser";

public Long getUserIdFromPrincipal() {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
isPrincipalNull(principal);
return Long.valueOf(principal.toString());
}

public void isPrincipalNull(
final Object principal
) {
if (principal.toString().equals(ANONYMOUS_USER)) {
throw new CustomException(ErrorType.EMPTY_PRINCIPLE_ERROR);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public Exception decode(String methodKey, Response response) {
// 응답결과 JSON 파싱
JSONObject jsonObject = new JSONObject(body);
String message = jsonObject.getString("message");
System.out.println(body);
// 응답 메시지를 기준으로 분기처리
if (message.equals("대학과 일치하지 않는 메일 도메인입니다.")) {
throw new CustomException(ErrorType.INVALID_EMAIL_DOMAIN_ERROR);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.sopt.seonyakServer.global.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public enum ErrorType {
NOT_FOUND_MEMBER_ERROR(HttpStatus.NOT_FOUND, "40401", "존재하지 않는 회원입니다."),
NOT_FOUND_REFRESH_TOKEN_ERROR(HttpStatus.NOT_FOUND, "40402", "존재하지 않는 리프레시 토큰입니다."),
NOT_FOUND_CREDENTIALS_JSON_ERROR(HttpStatus.NOT_FOUND, "40403", "구글미트 Credentials Json 파일을 찾을 수 없습니다."),
NOT_FOUND_SENIOR_BY_MEMBER(HttpStatus.NOT_FOUND, "40404", "해당 ID를 가진 멤버와 매핑된 선배를 찾을 수 없습니다."),

/**
* 409 CONFLICT
Expand Down

0 comments on commit 75028fa

Please sign in to comment.