274 lines
8.4 KiB
C#
274 lines
8.4 KiB
C#
using System.Text;
|
|
using ServerBase;
|
|
using ServerCommon; using ServerCore;
|
|
|
|
namespace BrokerApiCore;
|
|
|
|
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;
|
|
}
|
|
}
|