Skip to content

Commit

Permalink
Merge pull request #544 from sopt-makers/develop
Browse files Browse the repository at this point in the history
RELEASE 2024/11/09 20:56:00
  • Loading branch information
jun02160 authored Nov 9, 2024
2 parents d25bb8d + 32bc560 commit c847b6c
Show file tree
Hide file tree
Showing 15 changed files with 187 additions and 22 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,6 @@ out/

### config yml ###
application-**.yml

### Mac OS .DS_Store ###
.DS_Store
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,9 @@
import org.sopt.makers.internal.community.domain.AnonymousProfileImage;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface AnonymousProfileImageRepository extends JpaRepository<AnonymousProfileImage, Long> {

List<AnonymousProfileImage> findAllByIdNot(Long id);
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package org.sopt.makers.internal.community.service;

import lombok.RequiredArgsConstructor;
import org.sopt.makers.internal.community.domain.AnonymousProfileImage;
import org.sopt.makers.internal.community.repository.AnonymousProfileImageRepository;
import org.sopt.makers.internal.domain.community.AnonymousProfileImg;
import org.sopt.makers.internal.exception.NotFoundDBEntityException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand All @@ -16,6 +13,7 @@
public class AnonymousProfileImageService {

private final AnonymousProfileImageRepository anonymousProfileImageRepository;
private final static Long MAKERS_LOGO_IMAGE_ID = 6L;

public AnonymousProfileImageService(AnonymousProfileImageRepository anonymousProfileImageRepository) {
this.anonymousProfileImageRepository = anonymousProfileImageRepository;
Expand All @@ -27,7 +25,7 @@ public AnonymousProfileImageService(AnonymousProfileImageRepository anonymousPro
@Transactional(readOnly = true)
public AnonymousProfileImage getRandomProfileImage(List<Long> excludes) {
if (excludes.isEmpty() || excludes.size() >= profileImageMap.size()) {
return shuffle((long)(Math.random() * 5));
return shuffle((long) (Math.random() * 5));
}
return filtered(excludes);
}
Expand All @@ -37,15 +35,15 @@ private AnonymousProfileImage filtered(List<Long> excludes) {
.filter(i -> !excludes.contains(i))
.findFirst()
.map(profileImageMap::get)
.orElseGet(() -> shuffle((long)(Math.random() * 5)));
.orElseGet(() -> shuffle((long) (Math.random() * 5)));
}

private AnonymousProfileImage shuffle(Long index) {
return profileImageMap.get(index);
}

private void initializeProfileImageMap() {
List<AnonymousProfileImage> anonymousProfileImages = anonymousProfileImageRepository.findAll();
List<AnonymousProfileImage> anonymousProfileImages = anonymousProfileImageRepository.findAllByIdNot(MAKERS_LOGO_IMAGE_ID);
for (AnonymousProfileImage image : anonymousProfileImages) {
profileImageMap.put(image.getId(), image);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public record MemberProfileSpecificResponse(
List<MemberCareerResponse> careers,
Boolean allowOfficial,
Boolean isCoffeeChatActivate,
String coffeeChatBio,
@Schema(required = true)
Boolean isMine
) {
Expand Down Expand Up @@ -89,7 +88,7 @@ public record MemberCareerResponse(
Boolean isCurrent
){}

public static MemberProfileSpecificResponse checkIsBlindPhone(MemberProfileSpecificResponse response, Boolean isMine) {
public static MemberProfileSpecificResponse applyPhoneMasking(MemberProfileSpecificResponse response, Boolean isMine, Boolean isCoffeeChatActivate) {
return new MemberProfileSpecificResponse(
response.name(),
response.profileImage(),
Expand All @@ -115,8 +114,7 @@ public static MemberProfileSpecificResponse checkIsBlindPhone(MemberProfileSpeci
response.projects(),
response.careers(),
response.allowOfficial(),
response.isCoffeeChatActivate(),
response.coffeeChatBio(),
isCoffeeChatActivate,
isMine
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,17 @@ MemberProfileSpecificResponse toProfileSpecificResponse (
boolean isMine,
List<MemberProfileProjectDao> projects,
List<MemberProfileSpecificResponse.MemberActivityResponse> activities,
List<MemberProfileProjectVo> soptActivities
List<MemberProfileProjectVo> soptActivities,
Boolean isCoffeeChatActivate
);

@Mapping(target = "activities", source = "activities")
MemberProfileSpecificResponse toProfileSpecificResponse (
Member member,
boolean isMine,
List<MemberProfileProjectDao> projects,
List<MemberProfileSpecificResponse.MemberActivityResponse> activities
List<MemberProfileSpecificResponse.MemberActivityResponse> activities,
Boolean isCoffeeChatActivate
);

@Mapping(target = "activities", source = "activities")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.sopt.makers.internal.external.MakersCrewClient;
import org.sopt.makers.internal.mapper.MemberMapper;
import org.sopt.makers.internal.member.controller.dto.response.MemberInfoResponse;
import org.sopt.makers.internal.member.controller.dto.response.MemberPropertiesResponse;
import org.sopt.makers.internal.member.mapper.MemberResponseMapper;
import org.sopt.makers.internal.member.service.coffeechat.CoffeeChatService;
import org.sopt.makers.internal.service.MemberService;
Expand Down Expand Up @@ -168,11 +169,12 @@ public ResponseEntity<MemberProfileSpecificResponse> getUserProfile (
new MemberProfileSpecificResponse.MemberActivityResponse(entry.getKey(), entry.getValue())
).collect(Collectors.toList());
val isMine = Objects.equals(member.getId(), memberDetails.getId());
val response = MemberProfileSpecificResponse.checkIsBlindPhone(
val isCoffeeChatActivate = coffeeChatService.getCoffeeChatActivate(member.getId());
val response = MemberProfileSpecificResponse.applyPhoneMasking(
memberMapper.toProfileSpecificResponse(
member, true, memberProfileProjects, activityResponses, soptActivityResponse
member, true, memberProfileProjects, activityResponses, soptActivityResponse, isCoffeeChatActivate
),
isMine);
isMine, isCoffeeChatActivate);
sortProfileCareer(response);
return ResponseEntity.status(HttpStatus.OK).body(response);
}
Expand All @@ -197,8 +199,9 @@ public ResponseEntity<MemberProfileSpecificResponse> getMyProfile (
memberProfileProjects
);
val isMine = Objects.equals(member.getId(), memberDetails.getId());
val isCoffeeChatActivate = coffeeChatService.getCoffeeChatActivate(member.getId());
val response = memberMapper.toProfileSpecificResponse(
member, isMine, memberProfileProjects, activityResponses, soptActivityResponse
member, isMine, memberProfileProjects, activityResponses, soptActivityResponse, isCoffeeChatActivate
);
sortProfileCareer(response);
return ResponseEntity.status(HttpStatus.OK).body(response);
Expand Down Expand Up @@ -321,6 +324,14 @@ public ResponseEntity<Map<String, Boolean>> reportUser (
return ResponseEntity.status(HttpStatus.OK).body(Map.of("유저 신고 성공", true));
}

@Operation(summary = "Amplitude 를 위한 user properties 반환 API ")
@GetMapping("/property")
public ResponseEntity<MemberPropertiesResponse> getUserProperty (
@Parameter(hidden = true) @AuthenticationPrincipal InternalMemberDetails memberDetails
) {
return ResponseEntity.status(HttpStatus.OK).body(memberService.getMemberProperties(memberDetails.getId()));
}

private void sortProfileCareer (MemberProfileSpecificResponse response) {
response.careers().sort((a, b) -> {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package org.sopt.makers.internal.member.controller.dto.response;

import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChatStatus;

import java.util.List;

public record MemberPropertiesResponse(

Long id,

String major,

String job,

String organization,

List<String> part,

List<Integer> generation,

CoffeeChatStatus coffeeChatStatus,

Long receivedCoffeeChatCount,

Long sentCoffeeChatCount
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ public enum Career {
INTERN("인턴 경험만 있어요"),
JUNIOR("주니어 (0-3년)"),
MIDDLE("미들 (4-8년)"),
SENIOR("시니어 (9년 이상)")
SENIOR("시니어 (9년 이상)"),
STARTUP("창업 중")
;

private final String title;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.sopt.makers.internal.member.domain.coffeechat;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public enum CoffeeChatStatus {

ON(true),
OFF(false),
NONE(false)
;

private final boolean isCoffeeChatActivate;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,15 @@

import lombok.RequiredArgsConstructor;
import org.sopt.makers.internal.domain.Member;
import org.sopt.makers.internal.domain.MemberCareer;
import org.sopt.makers.internal.member.controller.dto.response.MemberInfoResponse;
import org.sopt.makers.internal.member.controller.dto.response.MemberPropertiesResponse;
import org.sopt.makers.internal.member.service.coffeechat.dto.MemberCoffeeChatPropertyDto;
import org.sopt.makers.internal.member.util.MemberUtil;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class MemberResponseMapper {
Expand All @@ -21,4 +27,26 @@ public MemberInfoResponse toMemberInfoResponse(Member member, Boolean isCoffeeCh
isCoffeeChatActive
);
}

public MemberPropertiesResponse toMemberPropertiesResponse(
Member member,
MemberCareer memberCareer,
MemberCoffeeChatPropertyDto coffeeChatProperty,
List<String> activitiesAndGeneration
) {
List<Integer> generations = MemberUtil.extractGenerations(activitiesAndGeneration);
List<String> activities = MemberUtil.extractActivities(activitiesAndGeneration);

return new MemberPropertiesResponse(
member.getId(),
memberCareer == null ? member.getMajor() : null,
memberCareer != null ? memberCareer.getTitle() : null,
memberCareer != null ? memberCareer.getCompanyName() : member.getUniversity(),
activities,
generations,
coffeeChatProperty.coffeeChatStatus(),
coffeeChatProperty.receivedCoffeeChatCount(),
coffeeChatProperty.sentCoffeeChatCount()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package org.sopt.makers.internal.member.repository.coffeechat;

import org.sopt.makers.internal.domain.Member;
import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChatHistory;
import org.springframework.data.jpa.repository.JpaRepository;

public interface CoffeeChatHistoryRepository extends JpaRepository<CoffeeChatHistory, Long> {

// CREATE

// READ
Long countBySender(Member sender);
Long countByReceiver(Member receiver);

// UPDATE

// DELETE
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@
import org.sopt.makers.internal.domain.Member;
import org.sopt.makers.internal.exception.ClientBadRequestException;
import org.sopt.makers.internal.exception.NotFoundDBEntityException;
import org.sopt.makers.internal.member.domain.coffeechat.Career;
import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChat;
import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChatSection;
import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChatTopicType;
import org.sopt.makers.internal.member.domain.coffeechat.*;
import org.sopt.makers.internal.member.repository.coffeechat.CoffeeChatHistoryRepository;
import org.sopt.makers.internal.member.repository.coffeechat.CoffeeChatRepository;
import org.sopt.makers.internal.member.repository.coffeechat.dto.CoffeeChatInfoDto;
import org.sopt.makers.internal.member.repository.coffeechat.dto.RecentCoffeeChatInfoDto;
import org.sopt.makers.internal.member.service.coffeechat.dto.MemberCoffeeChatPropertyDto;
import org.springframework.stereotype.Component;

import java.util.List;
Expand All @@ -20,6 +19,7 @@
public class CoffeeChatRetriever {

private final CoffeeChatRepository coffeeChatRepository;
private final CoffeeChatHistoryRepository coffeeChatHistoryRepository;

public CoffeeChat findCoffeeChatByMember(Member member) {
return coffeeChatRepository.findCoffeeChatByMember(member)
Expand Down Expand Up @@ -49,4 +49,20 @@ public List<RecentCoffeeChatInfoDto> recentCoffeeChatInfoList() {
public List<CoffeeChatInfoDto> searchCoffeeChatInfo(Long memberId, CoffeeChatSection section, CoffeeChatTopicType topicType, Career career, String part, String search) {
return coffeeChatRepository.findSearchCoffeeChatInfo(memberId, section, topicType, career, part, search);
}

public MemberCoffeeChatPropertyDto getMemberCoffeeChatProperty(Member member) {

Long receivedCoffeeChatCount = coffeeChatHistoryRepository.countByReceiver(member);
Long sentCoffeeChatCount = coffeeChatHistoryRepository.countBySender(member);
CoffeeChatStatus coffeeChatStatus;

if (!coffeeChatRepository.existsCoffeeChatByMember(member)) {
coffeeChatStatus = CoffeeChatStatus.NONE;
} else {
CoffeeChat coffeeChat = findCoffeeChatByMember(member);
coffeeChatStatus = coffeeChat.getIsCoffeeChatActivate() ? CoffeeChatStatus.ON : CoffeeChatStatus.OFF;
}

return new MemberCoffeeChatPropertyDto(coffeeChatStatus, receivedCoffeeChatCount, sentCoffeeChatCount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.sopt.makers.internal.member.service.coffeechat.dto;

import org.sopt.makers.internal.member.domain.coffeechat.CoffeeChatStatus;

public record MemberCoffeeChatPropertyDto(

CoffeeChatStatus coffeeChatStatus,

Long receivedCoffeeChatCount,

Long sentCoffeeChatCount
) {
}
18 changes: 18 additions & 0 deletions src/main/java/org/sopt/makers/internal/member/util/MemberUtil.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.sopt.makers.internal.member.util;

import java.util.List;

public class MemberUtil {

public static List<Integer> extractGenerations(List<String> activitiesAndGeneration) {
return activitiesAndGeneration.stream()
.map(item -> Integer.parseInt(item.split(" ")[0].replaceAll("[^0-9]", "")))
.toList();
}

public static List<String> extractActivities(List<String> activitiesAndGeneration) {
return activitiesAndGeneration.stream()
.map(item -> item.split(" ")[1])
.toList();
}
}
Loading

0 comments on commit c847b6c

Please sign in to comment.