[O] riik Chuni upsert all

This commit is contained in:
Azalea 2024-12-26 06:44:27 -05:00
parent fd44744029
commit add1e02d2f
2 changed files with 143 additions and 350 deletions

View File

@ -1,350 +0,0 @@
package icu.samnyan.aqua.sega.chusan.handler;
import com.fasterxml.jackson.core.JsonProcessingException;
import icu.samnyan.aqua.sega.general.BaseHandler;
import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCMissionProgressRepository;
import icu.samnyan.aqua.sega.chusan.dao.userdata.UserCMissionRepository;
import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll;
import icu.samnyan.aqua.sega.chusan.model.response.CodeResp;
import icu.samnyan.aqua.sega.chusan.model.userdata.*;
import icu.samnyan.aqua.sega.chusan.service.*;
import icu.samnyan.aqua.sega.general.model.Card;
import icu.samnyan.aqua.sega.general.model.response.UserRecentRating;
import icu.samnyan.aqua.sega.general.service.CardService;
import icu.samnyan.aqua.sega.util.jackson.StringMapper;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.time.LocalDateTime;
import java.util.*;
/**
* The handler for save user data. Only send in the end of the session.
*
* @author samnyan (privateamusement@protonmail.com)
*/
@AllArgsConstructor
@Component("ChusanUpsertUserAllHandler")
public class UpsertUserAllHandler implements BaseHandler {
private static final Logger logger = LoggerFactory.getLogger(UpsertUserAllHandler.class);
private final StringMapper mapper;
private final CardService cardService;
private final UserDataService userDataService;
private final UserCharacterService userCharacterService;
private final UserGameOptionService userGameOptionService;
private final UserMapAreaService userMapService;
private final UserItemService userItemService;
private final UserMusicDetailService userMusicDetailService;
private final UserActivityService userActivityService;
private final UserPlaylogService userPlaylogService;
private final UserChargeService userChargeService;
private final UserCourseService userCourseService;
private final UserDuelService userDuelService;
private final UserGeneralDataService userGeneralDataService;
private final UserLoginBonusService userLoginBonusService;
private final UserCMissionRepository userCMissionRepository;
private final UserCMissionProgressRepository userCMissionProgressRepository;
@Override
public String handle(Map<String, ?> request) throws JsonProcessingException {
String userId = (String) request.get("userId");
UpsertUserAll upsertUserAll = mapper.convert(request.get("upsertUserAll"), UpsertUserAll.class);
// Not all field will be sent. Check if they are exist first.
Chu3UserData newUserData;
// UserData
if (upsertUserAll.getUserData() == null) {
return null;
} else {
newUserData = upsertUserAll.getUserData().get(0);
Chu3UserData userData = userDataService.getUserByExtId(userId).orElseGet(() -> {
var data = new Chu3UserData();
Card card = cardService.getCardByExtId(userId).orElseThrow();
data.setCard(card);
return data;
});
newUserData.setId(userData.getId());
newUserData.setCard(userData.getCard());
// Decode Username
String userName = new String(newUserData.getUserName()
.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
newUserData.setUserName(userName);
newUserData.setUserNameEx("");
userDataService.saveAndFlushUserData(newUserData);
}
// userGameOption
if (upsertUserAll.getUserGameOption() != null) {
UserGameOption newUserGameOption = upsertUserAll.getUserGameOption().get(0);
Optional<UserGameOption> userGameOptionOptional = userGameOptionService.getByUser(newUserData);
UserGameOption userGameOption = userGameOptionOptional.orElseGet(() -> new UserGameOption(newUserData));
newUserGameOption.setId(userGameOption.getId());
newUserGameOption.setUser(userGameOption.getUser());
userGameOptionService.save(newUserGameOption);
}
// userMapList
if (upsertUserAll.getUserMapAreaList() != null) {
List<UserMap> userMapList = upsertUserAll.getUserMapAreaList();
Map<Integer, UserMap> newUserMapMap = new HashMap<>();
userMapList.forEach(newUserMap -> {
int mapId = newUserMap.getMapAreaId();
UserMap userMap;
Optional<UserMap> userMapOptional = userMapService.getByUserAndMapAreaId(newUserData, mapId);
userMap = userMapOptional.orElseGet(() -> new UserMap(newUserData));
newUserMap.setId(userMap.getId());
newUserMap.setUser(userMap.getUser());
newUserMapMap.put(mapId, newUserMap);
});
userMapService.saveAll(newUserMapMap.values());
}
// userCharacterList
if (upsertUserAll.getUserCharacterList() != null) {
List<UserCharacter> userCharacterList = upsertUserAll.getUserCharacterList();
Map<Integer, UserCharacter> newCharacterMap = new HashMap<>();
userCharacterList.forEach(newUserCharacter -> {
int characterId = newUserCharacter.getCharacterId();
Optional<UserCharacter> userCharacterOptional = userCharacterService.getByUserAndCharacterId(newUserData, characterId);
UserCharacter userCharacter = userCharacterOptional.orElseGet(() -> new UserCharacter(newUserData));
newUserCharacter.setId(userCharacter.getId());
newUserCharacter.setUser(userCharacter.getUser());
newCharacterMap.put(characterId, newUserCharacter);
});
userCharacterService.saveAll(newCharacterMap.values());
}
// userItemList
if (upsertUserAll.getUserItemList() != null) {
List<UserItem> userItemList = upsertUserAll.getUserItemList();
Map<String, UserItem> newUserItemMap = new HashMap<>();
userItemList.forEach(newUserItem -> {
int itemId = newUserItem.getItemId();
int itemKind = newUserItem.getItemKind();
Optional<UserItem> userItemOptional = userItemService.getByUserAndItemIdAndKind(newUserData, itemId, itemKind);
UserItem userItem = userItemOptional.orElseGet(() -> new UserItem(newUserData));
newUserItem.setId(userItem.getId());
newUserItem.setUser(userItem.getUser());
newUserItemMap.put(itemId + "-" + itemKind, newUserItem);
});
userItemService.saveAll(newUserItemMap.values());
}
// userMusicDetailList
if (upsertUserAll.getUserMusicDetailList() != null) {
List<UserMusicDetail> userMusicDetailList = upsertUserAll.getUserMusicDetailList();
Map<String, UserMusicDetail> newUserMusicDetailMap = new HashMap<>();
userMusicDetailList.forEach(newUserMusicDetail -> {
int musicId = newUserMusicDetail.getMusicId();
int level = newUserMusicDetail.getLevel();
Optional<UserMusicDetail> userMusicDetailOptional = userMusicDetailService.getByUserAndMusicIdAndLevel(newUserData, musicId, level);
UserMusicDetail userMusicDetail = userMusicDetailOptional.orElseGet(() -> new UserMusicDetail(newUserData));
newUserMusicDetail.setId(userMusicDetail.getId());
newUserMusicDetail.setUser(userMusicDetail.getUser());
newUserMusicDetailMap.put(musicId + "-" + level, newUserMusicDetail);
});
userMusicDetailService.saveAll(newUserMusicDetailMap.values());
}
// userActivityList
if (upsertUserAll.getUserActivityList() != null) {
List<UserActivity> userActivityList = upsertUserAll.getUserActivityList();
List<UserActivity> newUserActivityList = new LinkedList<>();
userActivityList.forEach(newUserActivity -> {
// No need to rename to activityId. jackson auto handle that
int activityId = newUserActivity.getActivityId();
int kind = newUserActivity.getKind();
Optional<UserActivity> userActivityOptional = userActivityService.getByUserAndActivityIdAndKind(newUserData, activityId, kind);
UserActivity userActivity = userActivityOptional.orElseGet(() -> new UserActivity(newUserData));
newUserActivity.setId(userActivity.getId());
newUserActivity.setUser(userActivity.getUser());
newUserActivityList.add(newUserActivity);
});
userActivityService.saveAll(newUserActivityList);
}
// userRecentRatingList
if(upsertUserAll.getUserRecentRatingList() != null) {
List<UserRecentRating> userRecentRatingList = upsertUserAll.getUserRecentRatingList();
StringBuilder sb = new StringBuilder();
userRecentRatingList.forEach(userRecentRating -> {
sb.append(userRecentRating.getMusicId()).append(":");
sb.append(userRecentRating.getDifficultId()).append(":");
sb.append(userRecentRating.getScore()).append(",");
});
if(sb.length() > 0) {
sb.deleteCharAt(sb.length() - 1);
}
UserGeneralData userGeneralData = userGeneralDataService.getByUserAndKey(newUserData, "recent_rating_list")
.orElseGet(() -> new UserGeneralData(newUserData, "recent_rating_list"));
userGeneralData.setPropertyValue(sb.toString());
userGeneralDataService.save(userGeneralData);
}
// userChargeList
if (upsertUserAll.getUserChargeList() != null) {
List<UserCharge> userChargeList = upsertUserAll.getUserChargeList();
List<UserCharge> newUserChargeList = new ArrayList<>();
userChargeList.forEach(newUserCharge -> {
int chargeId = newUserCharge.getChargeId();
Optional<UserCharge> userChargeOptional = userChargeService.getByUserAndChargeId(newUserData, chargeId);
UserCharge userCharge = userChargeOptional.orElseGet(() -> new UserCharge(newUserData));
newUserCharge.setId(userCharge.getId());
newUserCharge.setUser(userCharge.getUser());
newUserChargeList.add(newUserCharge);
});
userChargeService.saveAll(newUserChargeList);
}
// userPlaylogList
if (upsertUserAll.getUserPlaylogList() != null) {
List<UserPlaylog> userPlaylogList = upsertUserAll.getUserPlaylogList();
List<UserPlaylog> newUserPlaylogList = new ArrayList<>();
userPlaylogList.forEach(newUserPlaylog -> {
newUserPlaylog.setUser(newUserData);
newUserPlaylogList.add(newUserPlaylog);
});
if (newUserPlaylogList.size() > 0) userPlaylogService.saveAll(newUserPlaylogList);
}
// userCourseList
if (upsertUserAll.getUserCourseList() != null) {
List<UserCourse> userCourseList = upsertUserAll.getUserCourseList();
userCourseList.forEach(newUserCourse -> {
int courseId = newUserCourse.getCourseId();
Optional<UserCourse> userCourseOptional = userCourseService.getByUserAndCourseId(newUserData, courseId);
UserCourse userCourse = userCourseOptional.orElseGet(() -> new UserCourse(newUserData));
newUserCourse.setId(userCourse.getId());
newUserCourse.setUser(userCourse.getUser());
userCourseService.save(newUserCourse);
});
}
// userDuelList
if (upsertUserAll.getUserDuelList() != null) {
List<UserDuel> userDuelList = upsertUserAll.getUserDuelList();
Map<Integer, UserDuel> newUserDuelMap = new HashMap<>();
userDuelList.forEach(newUserDuel -> {
int duelId = newUserDuel.getDuelId();
Optional<UserDuel> userDuelOptional = userDuelService.getByUserAndDuelId(newUserData, duelId);
UserDuel userDuel = userDuelOptional.orElseGet(() -> new UserDuel(newUserData));
newUserDuel.setId(userDuel.getId());
newUserDuel.setUser(userDuel.getUser());
newUserDuelMap.put(duelId, newUserDuel);
});
userDuelService.saveAll(newUserDuelMap.values());
}
if (upsertUserAll.getUserLoginBonusList() != null){
List<Map<String, Object>> userLoginBonusList = upsertUserAll.getUserLoginBonusList();
Map<Integer, UserLoginBonus> newUserLoginBonusMap = new HashMap<>();
userLoginBonusList.forEach(newUserLoginBonus -> {
int loginBonusPresetId = Integer.parseInt((String) newUserLoginBonus.get("presetId"));
Optional<UserLoginBonus> userLoginBonusOptional = userLoginBonusService.getUserLoginBonus(Integer.parseInt(userId), loginBonusPresetId);
UserLoginBonus userLoginBonus = userLoginBonusOptional.orElseGet(UserLoginBonus::new);
userLoginBonus.setLastUpdateDate(LocalDateTime.now());
userLoginBonus.setWatched(true);
newUserLoginBonusMap.put(loginBonusPresetId, userLoginBonus);
});
userLoginBonusService.saveAll(newUserLoginBonusMap.values());
}
// userCMissionList
if (upsertUserAll.getUserCMissionList() != null){
List<Map<String, Object>> userCMissionList = upsertUserAll.getUserCMissionList();
userCMissionList.forEach(userCMission -> {
int missionId = Integer.parseInt((String) userCMission.get("missionId"));
int point = Integer.parseInt((String) userCMission.get("point"));
List<Map<String, Object>> userCMissionProgressList = (List<Map<String, Object>>) userCMission.get("userCMissionProgressList");
userCMissionRepository.findByUser_Card_ExtIdAndMissionId(Long.parseLong(userId), missionId).ifPresentOrElse(userCMission1 -> {
userCMission1.setPoint(point);
userCMissionRepository.save(userCMission1);
}, () -> {
UserCMission userCMission1 = new UserCMission();
userCMission1.setMissionId(missionId);
userCMission1.setPoint(point);
userCMission1.setUser(newUserData);
userCMissionRepository.save(userCMission1);
});
userCMissionProgressList.forEach(userCMissionProgress -> {
int order = Integer.parseInt((String) userCMissionProgress.get("order"));
int progress = Integer.parseInt((String) userCMissionProgress.get("progress"));
int stage = Integer.parseInt((String) userCMissionProgress.get("stage"));
userCMissionProgressRepository.findByUser_Card_ExtIdAndMissionIdAndOrder(Long.parseLong(userId), missionId, order).ifPresentOrElse(userCMissionProgress1 -> {
userCMissionProgress1.setProgress(progress);
userCMissionProgress1.setStage(stage);
userCMissionProgressRepository.save(userCMissionProgress1);
}, () -> {
UserCMissionProgress userCMissionProgress1 = new UserCMissionProgress();
userCMissionProgress1.setMissionId(missionId);
userCMissionProgress1.setOrder(order);
userCMissionProgress1.setProgress(progress);
userCMissionProgress1.setStage(stage);
userCMissionProgress1.setUser(newUserData);
userCMissionProgressRepository.save(userCMissionProgress1);
});
});
});
}
String json = mapper.write(new CodeResp(1));
logger.info("Response: " + json);
return json;
}
}

View File

@ -0,0 +1,143 @@
package icu.samnyan.aqua.sega.chusan.handler
import ext.*
import icu.samnyan.aqua.sega.chusan.model.Chu3Repos
import icu.samnyan.aqua.sega.chusan.model.request.UpsertUserAll
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMission
import icu.samnyan.aqua.sega.chusan.model.userdata.UserCMissionProgress
import icu.samnyan.aqua.sega.chusan.model.userdata.UserGeneralData
import icu.samnyan.aqua.sega.chusan.model.userdata.UserLoginBonus
import icu.samnyan.aqua.sega.general.BaseHandler
import icu.samnyan.aqua.sega.general.dao.CardRepository
import icu.samnyan.aqua.sega.general.model.response.UserRecentRating
import icu.samnyan.aqua.sega.util.jackson.StringMapper
import lombok.AllArgsConstructor
import org.springframework.stereotype.Component
import java.nio.charset.StandardCharsets
import java.time.LocalDateTime
/**
* The handler for save user data. Only send in the end of the session.
*
* @author samnyan (privateamusement@protonmail.com)
*/
@AllArgsConstructor
@Component("ChusanUpsertUserAllHandler")
class UpsertUserAllHandler(
val mapper: StringMapper,
val rp: Chu3Repos,
val cardRepo: CardRepository,
) : BaseHandler {
val logger = logger()
override fun handle(request: Map<String, Any>): Any? {
val ext = request["userId"]?.long ?: return null
val req = mapper.convert(request["upsertUserAll"], UpsertUserAll::class.java)
req.run {
// UserData
val oldUser = rp.userData.findByCard_ExtId(ext)()
val u = (userData?.get(0) ?: return null).apply {
id = oldUser?.id ?: 0
card = oldUser?.card ?: cardRepo.findByExtId(ext).expect("Card not found")
userName = String(userName.toByteArray(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)
userNameEx = ""
}.also { rp.userData.saveAndFlush(it) }
// Set users
listOfNotNull(
userPlaylogList, userGameOption, userMapAreaList, userCharacterList, userItemList,
userMusicDetailList, userActivityList, userChargeList, userCourseList, userDuelList,
).flatten().forEach { it.user = u }
// Ratings
fun Iterable<UserRecentRating>.str() = joinToString(",") { "${it.musicId}:${it.difficultId}:${it.score}" }
ls(
userRecentRatingList to "recent_rating_list", userRatingBaseList to "rating_base_list",
userRatingBaseHotList to "rating_hot_list", userRatingBaseNextList to "rating_next_list",
).filter { it.first != null }.forEach { (list, key) ->
val d = rp.userGeneralData.findByUserAndPropertyKey(u, key)()
?: UserGeneralData().apply { user = u; propertyKey = key }
rp.userGeneralData.save(d.apply { propertyValue = list!!.str() })
}
// Playlog
userPlaylogList?.let { rp.userPlaylog.saveAll(it) }
// List data
userGameOption?.get(0)?.let { obj ->
rp.userGameOption.saveAndFlush(obj.apply {
id = rp.userGameOption.findSingleByUser(u)()?.id ?: 0 }) }
userMapAreaList?.let { list ->
rp.userMap.saveAll(list.distinctBy { it.mapAreaId }.mapApply {
id = rp.userMap.findByUserAndMapAreaId(u, mapAreaId)?.id ?: 0 }) }
userCharacterList?.let { list ->
rp.userCharacter.saveAll(list.distinctBy { it.characterId }.mapApply {
id = rp.userCharacter.findByUserAndCharacterId(u, characterId)?.id ?: 0 }) }
userItemList?.let { list ->
rp.userItem.saveAll(list.distinctBy { it.itemId to it.itemKind }.mapApply {
id = rp.userItem.findByUserAndItemIdAndItemKind(u, itemId, itemKind)?.id ?: 0 }) }
userMusicDetailList?.let { list ->
rp.userMusicDetail.saveAll(list.distinctBy { it.musicId to it.level }.mapApply {
id = rp.userMusicDetail.findByUserAndMusicIdAndLevel(u, musicId, level)?.id ?: 0 }) }
userActivityList?.let { list ->
rp.userActivity.saveAll(list.distinctBy { it.activityId to it.kind }.mapApply {
id = rp.userActivity.findByUserAndActivityIdAndKind(u, activityId, kind)?.id ?: 0 }) }
userChargeList?.let { list ->
rp.userCharge.saveAll(list.distinctBy { it.chargeId }.mapApply {
id = rp.userCharge.findByUserAndChargeId(u, chargeId)()?.id ?: 0 }) }
userCourseList?.let { list ->
rp.userCourse.saveAll(list.distinctBy { it.courseId }.mapApply {
id = rp.userCourse.findByUserAndCourseId(u, courseId)?.id ?: 0 }) }
userDuelList?.let { list ->
rp.userDuel.saveAll(list.distinctBy { it.duelId }.mapApply {
id = rp.userDuel.findByUserAndDuelId(u, duelId)?.id ?: 0 }) }
// Need testing
userLoginBonusList?.let { list ->
rp.userLoginBonus.saveAll(list.distinctBy { it["presetId"] as String }.map {
val id = it["presetId"]!!.int
(rp.userLoginBonus.findLoginBonus(ext.int, 1, id)() ?: UserLoginBonus()).apply {
user = u.id.toInt()
presetId = id
lastUpdateDate = LocalDateTime.now()
isWatched = true
}
})
}
req.userCMissionList?.forEach { d ->
(rp.userCMission.findByUser_Card_ExtIdAndMissionId(ext, d.missionId)()
?: UserCMission().apply {
missionId = d.missionId
user = u
}
).apply { point = d.point }.also { rp.userCMission.save(it) }
d.userCMissionProgressList?.forEach inner@ { p ->
(rp.userCMissionProgress.findByUser_Card_ExtIdAndMissionIdAndOrder(ext, d.missionId, p.order)()
?: UserCMissionProgress().apply {
missionId = d.missionId
order = p.order
user = u
}
).apply {
progress = p.progress
stage = p.stage
}.also { rp.userCMissionProgress.save(it) }
}
}
}
return """{"returnCode":1}"""
}
}