회원가입 로직에 광고 트래킹 적용

- 광고 트래킹 관련 Entity 추가
- pid가 현재 광고 중인 pid인 경우 트래킹 로그 생성
This commit is contained in:
2025-03-02 23:45:08 +09:00
parent 801b9934d6
commit 3216c73ee8
11 changed files with 177 additions and 4 deletions

View File

@@ -7,6 +7,7 @@ import kr.co.vividnext.sodalive.member.following.CreatorFollowing
import kr.co.vividnext.sodalive.member.notification.MemberNotification
import kr.co.vividnext.sodalive.member.stipulation.StipulationAgree
import kr.co.vividnext.sodalive.member.tag.MemberCreatorTag
import java.time.LocalDateTime
import javax.persistence.CascadeType
import javax.persistence.Column
import javax.persistence.Entity
@@ -29,6 +30,12 @@ data class Member(
@Enumerated(value = EnumType.STRING)
var role: MemberRole = MemberRole.USER,
@Column(nullable = true)
var activePid: String? = null,
@Column(nullable = true)
var partnerExpirationDateTime: LocalDateTime? = null,
var isVisibleDonationRank: Boolean = true,
var isActive: Boolean = true,

View File

@@ -2,9 +2,12 @@ package kr.co.vividnext.sodalive.member
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.marketing.AdTrackingHistoryType
import kr.co.vividnext.sodalive.marketing.AdTrackingService
import kr.co.vividnext.sodalive.member.block.MemberBlockRequest
import kr.co.vividnext.sodalive.member.following.CreatorFollowRequest
import kr.co.vividnext.sodalive.member.login.LoginRequest
import kr.co.vividnext.sodalive.member.login.LoginResponse
import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest
import org.springframework.data.domain.Pageable
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -23,7 +26,10 @@ import org.springframework.web.multipart.MultipartFile
@RestController
@RequestMapping("/member")
class MemberController(private val service: MemberService) {
class MemberController(
private val service: MemberService,
private val trackingService: AdTrackingService
) {
@GetMapping("/check/email")
fun checkEmail(@RequestParam email: String) = service.duplicateCheckEmail(email)
@@ -40,7 +46,19 @@ class MemberController(private val service: MemberService) {
fun signUp(
@RequestPart("profileImage", required = false) profileImage: MultipartFile? = null,
@RequestPart("request") requestString: String
) = service.signUp(profileImage, requestString)
): ApiResponse<LoginResponse> {
val response = service.signUp(profileImage, requestString)
if (!response.marketingPid.isNullOrBlank()) {
trackingService.saveTrackingHistory(
pid = response.marketingPid,
type = AdTrackingHistoryType.SIGNUP,
memberId = response.memberId
)
}
return ApiResponse.ok(message = "회원가입을 축하드립니다.", data = response.loginResponse)
}
@PostMapping("/login")
fun login(@RequestBody loginRequest: LoginRequest) = service.login(loginRequest)

View File

@@ -27,6 +27,7 @@ import kr.co.vividnext.sodalive.member.nickname.NicknameChangeLogRepository
import kr.co.vividnext.sodalive.member.notification.MemberNotificationService
import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest
import kr.co.vividnext.sodalive.member.signUp.SignUpRequest
import kr.co.vividnext.sodalive.member.signUp.SignUpResponse
import kr.co.vividnext.sodalive.member.signUp.SignUpValidator
import kr.co.vividnext.sodalive.member.stipulation.Stipulation
import kr.co.vividnext.sodalive.member.stipulation.StipulationAgree
@@ -97,7 +98,7 @@ class MemberService(
fun signUp(
profileImage: MultipartFile?,
requestString: String
): ApiResponse<LoginResponse> {
): SignUpResponse {
val stipulationTermsOfService = stipulationRepository.findByIdOrNull(StipulationIds.TERMS_OF_SERVICE_ID)
?: throw SodaException("잘못된 요청입니다\n앱 종료 후 다시 시도해 주세요.")
@@ -117,7 +118,11 @@ class MemberService(
member.profileImage = uploadProfileImage(profileImage = profileImage, memberId = member.id!!)
agreeTermsOfServiceAndPrivacyPolicy(member, stipulationTermsOfService, stipulationPrivacyPolicy)
return ApiResponse.ok(message = "회원가입을 축하드립니다.", data = login(request.email, request.password))
return SignUpResponse(
memberId = member.id!!,
marketingPid = request.marketingPid,
loginResponse = login(request.email, request.password)
)
}
fun login(request: LoginRequest): ApiResponse<LoginResponse> {
@@ -289,6 +294,11 @@ class MemberService(
container = request.container
)
if (!request.marketingPid.isNullOrBlank()) {
member.activePid = request.marketingPid
member.partnerExpirationDateTime = LocalDateTime.now().plusYears(1)
}
return repository.save(member)
}

View File

@@ -7,6 +7,7 @@ data class SignUpRequest(
val password: String,
val nickname: String,
val gender: Gender,
val marketingPid: String? = null,
val isAgreeTermsOfService: Boolean,
val isAgreePrivacyPolicy: Boolean,
val container: String = "api"

View File

@@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.member.signUp
import kr.co.vividnext.sodalive.member.login.LoginResponse
data class SignUpResponse(
val memberId: Long,
val marketingPid: String?,
val loginResponse: LoginResponse
)