diff --git a/build.gradle b/build.gradle index 677e8c6..f7926a3 100644 --- a/build.gradle +++ b/build.gradle @@ -63,6 +63,8 @@ dependencies { implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.12.0' + implementation project(':referral') + } tasks.named('test') { diff --git a/referral/src/main/kotlin/Referral.kt b/referral/src/main/kotlin/Referral.kt index 0dd336b..f51b54e 100644 --- a/referral/src/main/kotlin/Referral.kt +++ b/referral/src/main/kotlin/Referral.kt @@ -2,7 +2,7 @@ package ru.soune interface Referral { - val userId: String + val userId: Long val referralLink: String val inviter: String? val currentLevel: String diff --git a/referral/src/main/kotlin/ReferralRepo.kt b/referral/src/main/kotlin/ReferralRepo.kt index 54a6c49..7a48039 100644 --- a/referral/src/main/kotlin/ReferralRepo.kt +++ b/referral/src/main/kotlin/ReferralRepo.kt @@ -2,32 +2,32 @@ package ru.soune interface ReferralRepo { - fun getUserReferralLink(userId: String): String + fun getUserReferralLink(userId: Long): String fun getUserIdByLink(link: String): String - fun getInviterIdForUser(userId: String): String? + fun getInviterIdForUser(userId: Long): Long? - fun getReferralLevelForUser(userId: String): String + fun getReferralLevelForUser(userId: Long): String - fun getReferralByUserId(userId: String): Referral + fun getReferralByUserId(userId: Long): Referral - fun getReferralInvitees(userId: String, pageSize: Int, pageNumber: Int): List + fun getReferralInvitees(userId: Long, pageSize: Int, pageNumber: Int): List // создаем новую запись в БД fun createReferralEntity(entity: Referral) // прибавить к totalIncome и availableIncome значение transferAmount - fun increaseIncome(userId: String, transferAmount: Int) + fun increaseIncome(userId: Long, transferAmount: Int) // установить active в true - fun activateUser(userId: String): Boolean + fun activateUser(userId: Long): Boolean // посчитать записи, у которых inviter == userId и active == true - fun getActiveInviteeForUser(userId: String): Int + fun getActiveInviteeForUser(userId: Long): Int // посчитать записи, у которых inviter == userId - fun getTotalInviteeForUser(userId: String): Int + fun getTotalInviteeForUser(userId: Long): Int - fun upgradeReferralLevelForUser(userId: String, newLevelId: String) + fun upgradeReferralLevelForUser(userId: Long, newLevelId: String) } \ No newline at end of file diff --git a/referral/src/main/kotlin/ReferralService.kt b/referral/src/main/kotlin/ReferralService.kt index bae3dc0..2ff40ee 100644 --- a/referral/src/main/kotlin/ReferralService.kt +++ b/referral/src/main/kotlin/ReferralService.kt @@ -5,7 +5,7 @@ class ReferralService( private val referralRepo: ReferralRepo, ) { - fun onRegister(userId: String, inviterReferralLink: String?) { + fun onRegister(userId: Long, inviterReferralLink: String?) { val initialReferralLevel = referralLevelProvider.getInitialReferralLevelId() val referralLink = referralRepo.getUserReferralLink(userId) val inviter = inviterReferralLink?.let(referralRepo::getUserIdByLink) @@ -24,7 +24,7 @@ class ReferralService( referralRepo.createReferralEntity(referral) } - fun onUserAccountRefill(userId: String, transferAmount: Int) { + fun onUserAccountRefill(userId: Long, transferAmount: Int) { val wasActivated = referralRepo.activateUser(userId) val inviterId = referralRepo.getInviterIdForUser(userId) ?: return val currentInviterLevel = referralRepo.getReferralLevelForUser(inviterId) @@ -47,11 +47,11 @@ class ReferralService( referralLevelProvider.getAvailableReferralLevels() - fun getReferralLevelForUser(userId: String): ReferralLevel = + fun getReferralLevelForUser(userId: Long): ReferralLevel = referralRepo.getReferralLevelForUser(userId) .let { referralLevelProvider.getReferralLevelById(it) } - fun getReferralStatForUser(userId: String): ReferralStat { + fun getReferralStatForUser(userId: Long): ReferralStat { var referral = referralRepo.getReferralByUserId(userId) return ReferralStat( totalInvitee = referralRepo.getTotalInviteeForUser(userId), @@ -62,6 +62,6 @@ class ReferralService( ) } - fun getInviteeForUser(userId: String, pageSize: Int, pageNumber: Int): List = + fun getInviteeForUser(userId: Long, pageSize: Int, pageNumber: Int): List = referralRepo.getReferralInvitees(userId, pageSize, pageNumber) } \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/configuration/ReferralConfig.java b/src/main/java/ru/soune/nocopy/configuration/ReferralConfig.java new file mode 100644 index 0000000..160e707 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/configuration/ReferralConfig.java @@ -0,0 +1,16 @@ +package ru.soune.nocopy.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.soune.ReferralLevelProvider; +import ru.soune.ReferralRepo; +import ru.soune.ReferralService; + +@Configuration +public class ReferralConfig { + + @Bean + public ReferralService referralService(ReferralLevelProvider referralLevelProvider, ReferralRepo referralRepo) { + return new ReferralService(referralLevelProvider, referralRepo); + } +} diff --git a/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java b/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java new file mode 100644 index 0000000..8185f14 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/dto/referral/ReferralRequest.java @@ -0,0 +1,19 @@ +package ru.soune.nocopy.dto.referral; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.soune.nocopy.entity.user.AuthToken; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class ReferralRequest { + private String token; + private Integer amount; + private Integer pageSize; + private Integer pageNumber; + private String action; +} diff --git a/src/main/java/ru/soune/nocopy/dto/register/RegRequest.java b/src/main/java/ru/soune/nocopy/dto/register/RegRequest.java index d9b630b..15d1c47 100644 --- a/src/main/java/ru/soune/nocopy/dto/register/RegRequest.java +++ b/src/main/java/ru/soune/nocopy/dto/register/RegRequest.java @@ -29,4 +29,6 @@ public class RegRequest { private String password; private String authToken; + + private String referralLink; } diff --git a/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java b/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java new file mode 100644 index 0000000..9213bf2 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/handler/ReferralHandler.java @@ -0,0 +1,91 @@ +package ru.soune.nocopy.handler; + +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import ru.soune.ReferralInvitee; +import ru.soune.ReferralLevel; +import ru.soune.ReferralService; +import ru.soune.ReferralStat; +import ru.soune.nocopy.dto.BaseRequest; +import ru.soune.nocopy.dto.BaseResponse; +import ru.soune.nocopy.dto.MessageCode; +import ru.soune.nocopy.dto.referral.ReferralRequest; +import ru.soune.nocopy.entity.user.AuthToken; +import ru.soune.nocopy.repository.AuthTokenRepository; + +import java.util.List; +import java.util.Map; + + +@Component +@RequiredArgsConstructor +public class ReferralHandler implements RequestHandler { + + private final ReferralService referralService; + + private final AuthTokenRepository authTokenRepository; + + private final ObjectMapper mapper = new ObjectMapper(); + + @Override + public BaseResponse handle(BaseRequest request) throws Exception { + ReferralRequest referralRequest = mapper.convertValue(request.getMessageBody(), ReferralRequest.class); + String action = referralRequest.getAction(); + String token = referralRequest.getToken(); + AuthToken authToken = authTokenRepository.findByToken(token).orElseThrow(); + + switch (action) { + case "refill": + return handleRefill(request, authToken.getUser().getId(), referralRequest.getAmount()); + case "levels": + return handleReferralLevels(request); + case "level": + return handleUserLevel(request, authToken.getUser().getId()); + case "userStats" : + return handleUserStats(request, authToken.getUser().getId()); + case "invitees": + return handleInvitees(referralRequest, request, authToken.getUser().getId()); + } + + return null; + } + + + private BaseResponse handleRefill(BaseRequest request, Long userId, Integer amount) { + referralService.onUserAccountRefill(userId, amount); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), Map.of("account", "refill")); + } + + private BaseResponse handleReferralLevels(BaseRequest request) { + List referralLevels = referralService.getReferralLevels(); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), referralLevels); + + } + + private BaseResponse handleUserLevel(BaseRequest request, Long userId) { + ReferralLevel referralLevelForUser = referralService.getReferralLevelForUser(userId); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), referralLevelForUser); + } + + private BaseResponse handleUserStats(BaseRequest request, Long userId) { + ReferralStat referralStatForUser = referralService.getReferralStatForUser(userId); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), referralStatForUser); + } + + private BaseResponse handleInvitees(ReferralRequest referralRequest, BaseRequest request, Long userId) { + List inviteeForUser = referralService.getInviteeForUser(userId, referralRequest.getPageSize(), + referralRequest.getPageNumber()); + + return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), + MessageCode.SUCCESS.getDescription(), inviteeForUser); + } +} diff --git a/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java b/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java index 6718fca..5c62223 100644 --- a/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java +++ b/src/main/java/ru/soune/nocopy/handler/RegRequestHandler.java @@ -6,6 +6,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.BindingResult; +import ru.soune.ReferralService; import ru.soune.nocopy.dto.*; import ru.soune.nocopy.dto.register.RegAnswer; import ru.soune.nocopy.dto.register.RegRequest; @@ -34,6 +35,9 @@ public class RegRequestHandler implements RequestHandler { private final EmailService emailService; + //TODO add when add all referall +// private final ReferralService referralService; + @Override public BaseResponse handle(BaseRequest request) throws ValidationException { RegRequest regRequest = objectMapper.convertValue(request.getMessageBody(), RegRequest.class); @@ -81,6 +85,8 @@ public class RegRequestHandler implements RequestHandler { regAnswer.setToken(token); regAnswer.setVerified(true); regAnswer.setActive(true); + //TODO add when add all referall +// referralService.onRegister(authToken.getUser().getId(), regRequest.getReferralLink()); return new BaseResponse(request.getMsgId(), MessageCode.SUCCESS.getCode(), MessageCode.SUCCESS.getDescription(), regAnswer); diff --git a/src/main/java/ru/soune/nocopy/service/referral/ReferralLevelProviderImpl.java b/src/main/java/ru/soune/nocopy/service/referral/ReferralLevelProviderImpl.java new file mode 100644 index 0000000..3bc2fdf --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/referral/ReferralLevelProviderImpl.java @@ -0,0 +1,31 @@ +package ru.soune.nocopy.service.referral; + +import org.springframework.stereotype.Component; +import ru.soune.ReferralLevel; +import ru.soune.ReferralLevelProvider; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class ReferralLevelProviderImpl implements ReferralLevelProvider { + + @Override + public List getAvailableReferralLevels() { + // TODO + + return new ArrayList(); + } + + @Override + public String getInitialReferralLevelId() { + return "bronze"; + } + + @Override + public ReferralLevel getReferralLevelById(String levelId) { + // TODO + + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ru/soune/nocopy/service/referral/ReferralRepoImpl.java b/src/main/java/ru/soune/nocopy/service/referral/ReferralRepoImpl.java new file mode 100644 index 0000000..ac9cdf5 --- /dev/null +++ b/src/main/java/ru/soune/nocopy/service/referral/ReferralRepoImpl.java @@ -0,0 +1,75 @@ +package ru.soune.nocopy.service.referral; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.springframework.stereotype.Repository; +import ru.soune.Referral; +import ru.soune.ReferralInvitee; +import ru.soune.ReferralRepo; + +import java.util.List; + +@Repository +public class ReferralRepoImpl implements ReferralRepo { + + @Override + public String getUserIdByLink(String link) { + // TODO + return ""; + } + + @Override + public @NotNull String getUserReferralLink(long userId) { + return ""; + } + + @Override + public @Nullable Long getInviterIdForUser(long userId) { + return 0L; + } + + @Override + public @NotNull String getReferralLevelForUser(long userId) { + return ""; + } + + @Override + public @NotNull Referral getReferralByUserId(long userId) { + return null; + } + + @Override + public @NotNull List getReferralInvitees(long userId, int pageSize, int pageNumber) { + return List.of(); + } + + @Override + public void createReferralEntity(@NotNull Referral entity) { + + } + + @Override + public void increaseIncome(long userId, int transferAmount) { + + } + + @Override + public boolean activateUser(long userId) { + return false; + } + + @Override + public int getActiveInviteeForUser(long userId) { + return 0; + } + + @Override + public int getTotalInviteeForUser(long userId) { + return 0; + } + + @Override + public void upgradeReferralLevelForUser(long userId, @NotNull String newLevelId) { + + } +}