초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,324 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UGQDataAccess.Repository;
using UGQDataAccess.Repository.Models;
using UGQDatabase.Models;
using ServerCore; using ServerBase;
using ServerCommon;
using UGQDataAccess.Logs;
using ServerCommon.BusinessLogDomain;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace UGQDataAccess.Service;
public class AccountService
{
readonly QuestIdSequenceRepository _questIdSequenceRepository;
readonly QuestContentRepository _questContentRepository;
readonly QuestDialogRepository _questDialogRepository;
readonly AccountRepository _accountRepository;
readonly GameQuestDataRepository _gameQuestDataRepository;
readonly CreatorPointHistoryRepository _creatorPointHistoryRepository;
readonly NpcNameRepository _npcNameRepository;
readonly UgqMetaGenerateService _ugqMetaGenerateService;
readonly ReserveAccountGradeRepository _reserveAccountGradeRepository;
public AccountService(QuestIdSequenceRepository questIdSequenceRepository,
QuestContentRepository questContentRepository,
QuestDialogRepository questDialogRepository,
AccountRepository accountRepository,
GameQuestDataRepository gameQuestDataRepository,
CreatorPointHistoryRepository creatorPointHistoryRepository,
NpcNameRepository npcNameRepository,
UgqMetaGenerateService ugqMetaGenerateService,
ReserveAccountGradeRepository reserveAccountGradeRepository)
{
_questIdSequenceRepository = questIdSequenceRepository;
_questContentRepository = questContentRepository;
_questDialogRepository = questDialogRepository;
_accountRepository = accountRepository;
_gameQuestDataRepository = gameQuestDataRepository;
_creatorPointHistoryRepository = creatorPointHistoryRepository;
_npcNameRepository = npcNameRepository;
_ugqMetaGenerateService = ugqMetaGenerateService;
_reserveAccountGradeRepository = reserveAccountGradeRepository;
}
public async Task<AllAccountQueryResult> getAccounts(int pageNumber, int pageSize, string? searchText, AccountSortType sortType)
{
return await _accountRepository.getAccounts(pageNumber, pageSize, searchText, sortType);
}
public async Task<long> getAllAccountCount()
{
return await _accountRepository.getAllCount();
}
public async Task<AccountEntity?> getAccount(string userGuid)
{
return await _accountRepository.get(userGuid);
}
public async Task<AccountEntity?> getAccountByAccountId(string accountId)
{
return await _accountRepository.getByAccountId(accountId);
}
public async Task<AccountEntity> getOrInsertAccount(string userGuid, string nickname, string accountId)
{
return await _accountRepository.getOrInsert(userGuid, nickname, accountId);
}
public async Task<AccountEntity?> saveRefreshToken(string userGuid, string refreshToken, DateTime? refreshTokenExpryTime)
{
return await _accountRepository.saveRefreshToken(userGuid, refreshToken, refreshTokenExpryTime);
}
public async Task<AccountEntity?> deleteRefreshToken(string userGuid)
{
return await _accountRepository.deleteRefreshToken(userGuid);
}
public async Task<(ServerErrorCode, AccountEntity?)> addSlotCount(string userGuid, int count, int? slotCountVersion)
{
if(count < 1)
return (ServerErrorCode.UgqServerException, null);
// 슬롯 증가는 재시도 없이 변경 못했으면 실패 리턴
var updated = await _accountRepository.addSlotCount(userGuid, slotCountVersion, count);
if (updated == null)
return (ServerErrorCode.UgqExceedTransactionRetry, null);
return (ServerErrorCode.Success, updated);
}
public async Task<(ServerErrorCode, AccountEntity?)> modifySlotCount(string userGuid, int count, string adminUsername)
{
int retryCount = 0;
while (retryCount < UGQConstants.MAX_UPDATE_RETRY_COUNT)
{
var entity = await _accountRepository.get(userGuid);
if (entity == null)
return (ServerErrorCode.UgqNullEntity, null);
int haveCount = ServerCommon.MetaHelper.GameConfigMeta.UGQDefaultSlot + entity.AdditionalSlotCount + count;
if (haveCount < 0 || haveCount > ServerCommon.MetaHelper.GameConfigMeta.UGQMaximumSlot)
return (ServerErrorCode.UgqSlotLimit, null);
var updated = await _accountRepository.addSlotCount(userGuid, entity.SlotCountVersion, count);
if (updated == null)
{
retryCount++;
Log.getLogger().warn($"slotCount version missmatch. retryCount: {retryCount}");
continue;
}
List<ILogInvoker> business_logs = [
new UgqApiAddSlotBusinessLog(updated.AdditionalSlotCount, adminUsername),
];
var log_action = new LogActionEx(LogActionType.UgqApiAddSlot);
UgqApiBusinessLogger.collectLogs(log_action, updated.UserGuid, business_logs);
return (ServerErrorCode.Success, updated);
}
return (ServerErrorCode.UgqExceedTransactionRetry, null);
}
public async Task<ServerErrorCode> addCreatorPoint(string userGuid, long questId, long revision, double amount, UgqCreatorPointReason reason)
{
int retryCount = 0;
while (retryCount < UGQConstants.MAX_UPDATE_RETRY_COUNT)
{
var entity = await _accountRepository.getOrInsertForGameUser(userGuid);
if (entity == null)
return ServerErrorCode.UgqNullEntity;
var updated = await _accountRepository.incCreatorPoint(userGuid, entity.CreatorPointVersion, amount);
if (updated == null)
{
retryCount++;
Log.getLogger().warn($"creatorPoint version missmatch. retryCount: {retryCount}");
continue;
}
CreatorPointHistoryEntity historyEntity = new CreatorPointHistoryEntity
{
UserGuid = userGuid,
QuestId = questId,
Revision = revision,
Kind = CreatorPointHistoryKind.QuestProfit,
DetailReason = "Development",
Amount = amount,
TotalAmount = updated.CreatorPoint,
CreatedAt = DateTime.UtcNow
};
await _creatorPointHistoryRepository.insert(historyEntity);
List<ILogInvoker> business_logs = [
new UgqApiCreatorPointBusinessLog(amount, questId, revision, "", reason, ""),
];
var log_action = new LogActionEx(LogActionType.UgqApiCreatorPoint);
UgqApiBusinessLogger.collectLogs(log_action, userGuid, business_logs);
return ServerErrorCode.Success;
}
return ServerErrorCode.UgqExceedTransactionRetry;
}
public async Task<ServerErrorCode> decCreatorPoint(string userGuid, int amount, UgqCreatorPointReason reason)
{
int retryCount = 0;
while (retryCount < UGQConstants.MAX_UPDATE_RETRY_COUNT)
{
var entity = await _accountRepository.get(userGuid);
if (entity == null)
return ServerErrorCode.UgqNullEntity;
// 포인트가 0보다 작아지지 않게 처리해야 한다
if (entity.CreatorPoint < amount)
return ServerErrorCode.UgqNotEnoughCreatorPoint;
int creatorPointVersion = entity.CreatorPointVersion ?? 1;
var updated = await _accountRepository.incCreatorPoint(userGuid, creatorPointVersion, -amount);
if (updated == null)
{
retryCount++;
Log.getLogger().warn($"creatorPoint version missmatch. retryCount: {retryCount}");
continue;
}
CreatorPointHistoryEntity historyEntity = new CreatorPointHistoryEntity
{
UserGuid = userGuid,
QuestId = 0,
Revision = 0,
Kind = CreatorPointHistoryKind.SettleUp,
DetailReason = "Development",
Amount = -amount,
TotalAmount = updated.CreatorPoint,
CreatedAt = DateTime.UtcNow
};
await _creatorPointHistoryRepository.insert(historyEntity);
List<ILogInvoker> business_logs = [
new UgqApiCreatorPointBusinessLog(-amount, 0, 0, "", reason, ""),
];
var log_action = new LogActionEx(LogActionType.UgqApiCreatorPoint);
UgqApiBusinessLogger.collectLogs(log_action, userGuid, business_logs);
return ServerErrorCode.Success;
}
return ServerErrorCode.UgqExceedTransactionRetry;
}
public async Task<AccountEntity?> modifyAccountGrade(string userGuid, UgqGradeType grade)
{
return await _accountRepository.modifyAccountGrade(userGuid, grade);
}
public async Task<AccountEntity?> promoteAccountGrade(string userGuid, UgqGradeType before, UgqGradeType after)
{
return await _accountRepository.promoteAccountGrade(userGuid, before, after);
}
public async Task<(ServerErrorCode, AccountEntity?)> modifyCreatorPoint(string userGuid, int amount, string reason, string adminUsername)
{
int retryCount = 0;
while (retryCount < UGQConstants.MAX_UPDATE_RETRY_COUNT)
{
var entity = await _accountRepository.get(userGuid);
if (entity == null)
return (ServerErrorCode.UgqNullEntity, null);
// 포인트가 0보다 작아지지 않게 처리해야 한다
if (amount < 0 && entity.CreatorPoint < -amount)
return (ServerErrorCode.UgqNotEnoughCreatorPoint, null);
int? creatorPointVersion = entity.CreatorPointVersion;
var updated = await _accountRepository.incCreatorPoint(userGuid, creatorPointVersion, amount);
if (updated == null)
{
retryCount++;
Log.getLogger().warn($"creatorPoint version missmatch. retryCount: {retryCount}");
continue;
}
CreatorPointHistoryEntity historyEntity = new CreatorPointHistoryEntity
{
UserGuid = userGuid,
QuestId = 0,
Revision = 0,
Kind = CreatorPointHistoryKind.Admin,
DetailReason = reason,
Amount = amount,
TotalAmount = updated.CreatorPoint,
CreatedAt = DateTime.UtcNow
};
await _creatorPointHistoryRepository.insert(historyEntity);
List<ILogInvoker> business_logs = [
new UgqApiCreatorPointBusinessLog(amount, 0, 0, adminUsername, UgqCreatorPointReason.Admin, reason),
];
var log_action = new LogActionEx(LogActionType.UgqApiCreatorPoint);
UgqApiBusinessLogger.collectLogs(log_action, userGuid, business_logs);
return (ServerErrorCode.Success, updated);
}
return (ServerErrorCode.UgqExceedTransactionRetry, null);
}
public async Task<AllReserveAccountGradeResult> getReserveAccountGrades(int pageNumber, int pageSize, AccountGradeSortType sortType, AccountGradeProcessType processType, string userGuid)
{
return await _reserveAccountGradeRepository.getAccounts(pageNumber, pageSize, sortType, processType, userGuid);
}
public async Task<long> getAllReserveAccountGradeCount()
{
return await _reserveAccountGradeRepository.getAllCount();
}
public async Task<ReserveAccountGradeEntity?> getReserveAccountGrade(string userGuid)
{
return await _reserveAccountGradeRepository.get(userGuid);
}
public async Task<List<ReserveAccountGradeEntity>> getReserveAccountGrade(string userGuid, AccountGradeProcessType processType)
{
return await _reserveAccountGradeRepository.get(userGuid, processType);
}
public async Task<ReserveAccountGradeEntity> reserveAccountGrade(string userGuid, UgqGradeType beforeGrade, UgqGradeType grade, DateTime reserveTime)
{
return await _reserveAccountGradeRepository.reserveAccountGrade(userGuid, beforeGrade, grade, reserveTime);
}
public async Task<ReserveAccountGradeEntity> modifyReserveAccountGrade(string reserveId, UgqGradeType grade, DateTime reserveTime)
{
return await _reserveAccountGradeRepository.modifyReserveAccountGrade(reserveId, grade, reserveTime);
}
public async Task<List<ReserveAccountGradeEntity>> completeReserveAccountGrade()
{
return await _reserveAccountGradeRepository.completeReserveAccountGrade();
}
public async Task<ServerErrorCode> deleteReserveAccountGrade(string reserveId)
{
return await _reserveAccountGradeRepository.deleteReserveAccountGrade(reserveId);
}
}