초기커밋
This commit is contained in:
277
BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs
Normal file
277
BrokerApiCore/Entity/Actions/BrokerMailSendAction.cs
Normal file
@@ -0,0 +1,277 @@
|
||||
using System.Text;
|
||||
|
||||
using BrokerCore.BrokerBusinessLog;
|
||||
|
||||
using ServerCommon;
|
||||
|
||||
using ServerCore; using ServerBase;
|
||||
|
||||
namespace BrokerCore.Entity.Actions;
|
||||
|
||||
using MetaAssets;
|
||||
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
|
||||
public class BrokerMailSendAction : EntityActionBase
|
||||
{
|
||||
private readonly DynamoDbClient m_dynamo_db_client;
|
||||
|
||||
public BrokerMailSendAction(EntityBase owner, DynamoDbClient dynamoDbClient) : base(owner)
|
||||
{
|
||||
m_dynamo_db_client = dynamoDbClient;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
}
|
||||
|
||||
public override Task<Result> onInit()
|
||||
{
|
||||
return Task.FromResult(new Result());
|
||||
}
|
||||
|
||||
string makeMailGuid(DateTime now)
|
||||
{
|
||||
var guid = Guid.NewGuid().ToString("N");
|
||||
return $"{now.ToString("yyyy/MM/dd/HH:mm:ss:ff")}-{guid}";
|
||||
}
|
||||
|
||||
private void setMailAttribute(MailSendOption option)
|
||||
{
|
||||
DateTime now = DateTimeHelper.Current;
|
||||
var expire_date = now.AddSeconds(MetaHelper.GameConfigMeta.SystemMailStoragePeriod);
|
||||
string mail_guid = makeMailGuid(now);
|
||||
|
||||
var mail_attribute = getOwner().getEntityAttributeNotNull<MailAttribute>();
|
||||
mail_attribute.MailGuid = mail_guid;
|
||||
mail_attribute.SenderNickName = option.SenderNickName;
|
||||
mail_attribute.SenderGuid = option.SenderGuid;
|
||||
mail_attribute.ReceiverNickName = option.ReceiverNickName;
|
||||
mail_attribute.ReceiverGuid = option.ReceiverUserGuid;
|
||||
mail_attribute.Title = option.Title;
|
||||
mail_attribute.Text = option.Text;
|
||||
mail_attribute.CreateTime = now;
|
||||
mail_attribute.ExpireTime = expire_date;
|
||||
mail_attribute.IsSystemMail = option.IsSystemMail;
|
||||
mail_attribute.IsRead = false;
|
||||
mail_attribute.IsGetItem = false;
|
||||
mail_attribute.IsTextByMetaData = option.IsTextByMetaData;
|
||||
mail_attribute.ItemList = option.ItemList;
|
||||
mail_attribute.newEntityAttribute();
|
||||
}
|
||||
|
||||
public async Task<Result> sendMail(MailSendOption mailSendOption, Func<Task> operationSuccess,
|
||||
Func<Task> operationFail)
|
||||
{
|
||||
var result = new Result();
|
||||
var user_guid = mailSendOption.ReceiverUserGuid;
|
||||
StringBuilder str_builder = new();
|
||||
str_builder.Append($"guid : {user_guid}, nickname : {mailSendOption.ReceiverNickName}");
|
||||
str_builder.Append($" accountId : {mailSendOption.AccountId}");
|
||||
|
||||
setMailAttribute(mailSendOption);
|
||||
|
||||
var (doc_result, doc) = await getOwner().getEntityAttributeNotNull<MailAttribute>().toDocBase()!;
|
||||
if (doc_result.isFail() || doc is null)
|
||||
{
|
||||
Log.getLogger().error($"fail create system mail, {str_builder.ToString()}");
|
||||
return doc_result;
|
||||
}
|
||||
|
||||
var mail_doc = doc as ReceivedMailDoc;
|
||||
NullReferenceCheckHelper.throwIfNull(mail_doc,
|
||||
() => $"mail_doc is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}");
|
||||
|
||||
var log_actor = getOwner() as IWithLogActor;
|
||||
NullReferenceCheckHelper.throwIfNull(log_actor,
|
||||
() => $"log_actor is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}");
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(log_actor, LogActionType.MailSend, m_dynamo_db_client,
|
||||
true);
|
||||
batch.addQuery(new DBQEntityWrite(mail_doc));
|
||||
batch.addQuery(new QueryFinal(),
|
||||
async (query) =>
|
||||
{
|
||||
// actionSuccess 실행하기
|
||||
await operationSuccess();
|
||||
return QueryBatchBase.QueryResultType.Success;
|
||||
},
|
||||
async (query, errorResult) =>
|
||||
{
|
||||
await operationFail();
|
||||
return QueryBatchBase.QueryResultType.QueryFailed;
|
||||
}
|
||||
);
|
||||
|
||||
var query_result = await batch.doQueryWithStopwatch();
|
||||
if (query_result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"broker system mail send error, {str_builder.ToString()}");
|
||||
return query_result;
|
||||
}
|
||||
|
||||
var mail_attrib = mail_doc.getAttrib<MailAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_attrib,
|
||||
() => $"mail_attrib is null !!! - receiverUserGuid:{mailSendOption.ReceiverUserGuid}");
|
||||
|
||||
// 비즈니스 로그 작성
|
||||
var log_data = new MailLogData();
|
||||
setMailData(log_data, mail_attrib);
|
||||
BusinessLogger.collectLog(log_actor, new MailBusinessLog(log_data));
|
||||
|
||||
Log.getLogger().info($"system mail send success, {str_builder.ToString()}");
|
||||
return result;
|
||||
}
|
||||
|
||||
private void setMailData(in MailLogData logData, in MailAttrib mailAttrib)
|
||||
{
|
||||
logData.MailGuid = mailAttrib.MailGuid;
|
||||
logData.Title = mailAttrib.Title;
|
||||
logData.Text = mailAttrib.Text;
|
||||
logData.IsSystemMail = mailAttrib.IsSystemMail;
|
||||
logData.IsReadMail = mailAttrib.IsRead;
|
||||
logData.IsGetItem = mailAttrib.IsGetItem;
|
||||
logData.SenderNickname = mailAttrib.SenderNickName;
|
||||
logData.SenderGuid = mailAttrib.SenderGuid;
|
||||
logData.ReceiverNickname = mailAttrib.ReceiverNickName;
|
||||
logData.ReceiverGuid = mailAttrib.ReceiverGuid;
|
||||
logData.CreateTime = mailAttrib.CreateTime;
|
||||
logData.ExpireTime = mailAttrib.ExpireTime;
|
||||
logData.IsTextByMetaData = mailAttrib.IsTextByMetaData;
|
||||
logData.packageOrderId = mailAttrib.packageOrderId;
|
||||
logData.ItemList = mailAttrib.ItemList;
|
||||
}
|
||||
|
||||
public MailSendOption createSystemSendMailOptionByMeta(
|
||||
ProductMetaData productMeta,
|
||||
SystemMailMetaData mailMeta,
|
||||
string receiverUserGuid,
|
||||
string receiverNickName, int amount)
|
||||
{
|
||||
DateTime now = DateTimeHelper.Current;
|
||||
var expire_date = now.AddSeconds(MetaHelper.GameConfigMeta.SystemMailStoragePeriod);
|
||||
// if (productMeta.Storage_Period_First != 0)
|
||||
// {
|
||||
// expire_date = DateTime.UtcNow.AddMinutes(productMeta.Storage_Period_First);
|
||||
// }
|
||||
var mail_send_option = new MailSendOption
|
||||
{
|
||||
ReceiverUserGuid = receiverUserGuid,
|
||||
ReceiverNickName = receiverNickName,
|
||||
IsSystemMail = true,
|
||||
IsTextByMetaData = true,
|
||||
Title = mailMeta.Mail_Title,
|
||||
Text = mailMeta.Mail_Desc,
|
||||
ExpireDate = expire_date,
|
||||
ItemList = getMailItems(productMeta, amount).ToList(),
|
||||
PackageOrderId = string.Empty,
|
||||
};
|
||||
return mail_send_option;
|
||||
}
|
||||
|
||||
private static IEnumerable<ServerCommon.MailItem> getMailItems(ProductMetaData productMetaData, int amount)
|
||||
{
|
||||
if (productMetaData.ItemID_First != 0)
|
||||
{
|
||||
IEnumerable<ServerCommon.MailItem> total_items = Enumerable.Range(0, amount).Select(i =>
|
||||
{
|
||||
return productMetaData.First_List.Select(itemMeta => new ServerCommon.MailItem()
|
||||
{
|
||||
ItemId = (UInt32)itemMeta.Id,
|
||||
Count = itemMeta.Value,
|
||||
ProductId = (UInt32)productMetaData.Id,
|
||||
isRepeatProduct = false
|
||||
});
|
||||
}).SelectMany(x => x);
|
||||
return total_items;
|
||||
}
|
||||
|
||||
return new List<ServerCommon.MailItem>();
|
||||
}
|
||||
}
|
||||
|
||||
public class BrokerMailRecvAction : EntityActionBase
|
||||
{
|
||||
private readonly DynamoDbClient m_dynamo_db_client;
|
||||
|
||||
public BrokerMailRecvAction(EntityBase owner, DynamoDbClient dynamoDbClient) : base(owner)
|
||||
{
|
||||
m_dynamo_db_client = dynamoDbClient;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
public override Task<Result> onInit()
|
||||
{
|
||||
return Task.FromResult(new Result());
|
||||
}
|
||||
|
||||
public async Task<(Result, List<ReceivedMailDoc>)> findReceivedMailDoc(string userGuid)
|
||||
{
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var dynamo_db_client = m_dynamo_db_client;
|
||||
|
||||
var received_mail_docs = new List<ReceivedMailDoc>();
|
||||
|
||||
var doc = new ReceivedMailDoc(userGuid);
|
||||
var event_tid = Guid.NewGuid().ToString("N");
|
||||
var query_config = dynamo_db_client.makeQueryConfigForReadByPKOnly(doc.getPK());
|
||||
var (result, read_docs) =
|
||||
await dynamo_db_client.simpleQueryDocTypesWithQueryOperationConfig<ReceivedMailDoc>(query_config);
|
||||
if (result.isSuccess())
|
||||
{
|
||||
foreach (var recv_mail_doc in read_docs)
|
||||
{
|
||||
var mail_attrib = recv_mail_doc.getAttrib<MailAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(mail_attrib,
|
||||
() => $"mail_attrib is null !!! - userGuid:{userGuid}");
|
||||
|
||||
if (DateTimeHelper.Current > mail_attrib.ExpireTime)
|
||||
{
|
||||
var to_delete_result =
|
||||
await dynamo_db_client.simpleDeleteDocumentWithDocType(recv_mail_doc, event_tid);
|
||||
if (to_delete_result.isFail())
|
||||
{
|
||||
err_msg =
|
||||
$"Failed to simpleDeleteDocumentWithDocType() !!!, can't received mail : Mail:{mail_attrib.toBasicString()} - userGuid:{userGuid}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
else
|
||||
{
|
||||
err_msg =
|
||||
$"Mail deleted with expired retention period !!! : deletedMail:{mail_attrib.toBasicString()} - userGuid:{userGuid}";
|
||||
Log.getLogger().info(err_msg);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
received_mail_docs.Add(recv_mail_doc);
|
||||
}
|
||||
}
|
||||
|
||||
return (result, received_mail_docs);
|
||||
}
|
||||
|
||||
public async Task<Result> deleteMail(string mailGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var mail_doc = new ReceivedMailDoc(mailGuid);
|
||||
var event_tid = Guid.NewGuid().ToString("N");
|
||||
result = await m_dynamo_db_client.simpleDeleteDocumentWithDocType(mail_doc, event_tid);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg =
|
||||
$"Failed to simpleDeleteDocumentWithDocType() !!!, can't received mail : Mail:{mail_doc.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user