// using Microsoft.EntityFrameworkCore; // // using ServerCommon; // // namespace BrokerCore.Repository; // // using Common; // // using DbEntity; // using Context; // // public class SapphireExchangeOrderRepo // { // private readonly MetaverseBrokerDbContext m_db_context; // // public SapphireExchangeOrderRepo(MetaverseBrokerDbContext dbContext) // { // m_db_context = dbContext; // } // // //================================================================================ // // 사파이어 교환 주문을 추가한다. // // 트랜잭션을 사용한다. // //================================================================================ // public async Task add(SapphireExchangeOrder order, CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // m_db_context.SapphireExchangeOrders.Add(order); // await m_db_context.SaveChangesAsync(cancellationToken); // return result; // } // catch (Exception e) // { // result.setFail(ServerErrorCode.InternalServerError, e.Message); // } // // return result; // } // // public async Task delete(SapphireExchangeOrder order, CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // m_db_context.SapphireExchangeOrders.Remove(order); // await m_db_context.SaveChangesAsync(cancellationToken); // } // catch (Exception e) // { // result.setFail(ServerErrorCode.InternalServerError, e.Message); // } // // return result; // } // // //================================================================================ // // 사파이어 교환 주문을 비동기로 업데이트한다. // // 트랜잭션을 사용한다. // // OrderId를 키로 사용한다. // // OrderType과 OrderCompletedAt만 업데이트한다. // //================================================================================ // public async Task<(Result, SapphireExchangeOrder?)> findAndComplete(string orderId, // CancellationToken cancellationToken = default) // { // var result = new Result(); // // var transaction = await m_db_context.Database.BeginTransactionAsync(cancellationToken).ConfigureAwait(false); // // await using var transaction1 = transaction.ConfigureAwait(false); // try // { // var order = await m_db_context.SapphireExchangeOrders.Where(x => x.OrderId == orderId).FirstOrDefaultAsync(cancellationToken); // Guard.Against.isNull(order, ServerErrorCode.ExchangeOrderIdNotFound, "Invalid orderId"); // if (order.OrderStatus != ExchangeOrderStatus.Pending) // { // result.setFail(ServerErrorCode.Success, $"Fail To Complete OrderStatus Not Pending: orderId {orderId}, order_status {order.OrderStatus}"); // return (result, order); // } // // order.OrderStatus = ExchangeOrderStatus.Completed; // order.CompletedAt = DateTime.Now; // m_db_context.SapphireExchangeOrders.Attach(order); // m_db_context.Entry(order).Property(x => x.OrderStatus).IsModified = true; // m_db_context.Entry(order).Property(x => x.CompletedAt).IsModified = true; // await m_db_context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); // // await transaction.CommitAsync(cancellationToken).ConfigureAwait(false); // return (new Result(), order); // } // catch (Exception e) // { // // await transaction.RollbackAsync(cancellationToken).ConfigureAwait(false); // return (new Result { ResultString = e.Message }, null); // } // } // // // public async Task updateForPending(SapphireExchangeOrder order, // // CancellationToken cancellationToken = default) // // { // // // await using var transaction = await m_db_context.Database.BeginTransactionAsync(cancellationToken); // // try // // { // // m_db_context.SapphireExchangeOrders.Attach(order); // // m_db_context.Entry(order).Property(x => x.OrderStatus).IsModified = true; // // await m_db_context.SaveChangesAsync(cancellationToken); // // // await transaction.CommitAsync(cancellationToken); // // return new Result(); // // } // // catch (Exception e) // // { // // // await transaction.RollbackAsync(cancellationToken); // // return new Result { ResultString = e.Message }; // // } // // } // //========================================================================== // //SELECT * // // FROM `sapphire_exchange_order` // // WHERE `PlanetId` = @planetId // // AND `UserGuid` = @userGuid // // AND (@orderStatus IS NULL OR `OrderStatus` = @orderStatus) // // ORDER BY `CreatedAt` ASC // // LIMIT @pageSize OFFSET @offset; // //========================================================================== // public async Task<(Result, IEnumerable?)> findList( // string planetId, // string userGuid, // ExchangeOrderStatus? orderStatus = null, // int pageIndex = 1, // int pageSize = 20, // string sortOrder = "asc", // CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // var query = m_db_context.SapphireExchangeOrders.AsQueryable(); // // if (!string.IsNullOrEmpty(planetId)) // { // query = query.Where(x => x.PlanetId == planetId); // } // // if (!string.IsNullOrEmpty(userGuid)) // { // query = query.Where(x => x.UserGuid == userGuid); // } // // //orderStatus.HasValue는 orderStatus가 null일 때도 에러가 발생하지 않음. orderStatus가 null이면 HasValue는 false를 반환. // if (orderStatus.HasValue) // { // query = query.Where(x => x.OrderStatus == orderStatus); // } // // query = sortOrder.ToLower() == "desc" // ? query.OrderByDescending(o => o.CreatedAt) // : query.OrderBy(o => o.CreatedAt); // // var orders = await query // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToArrayAsync(cancellationToken); // // return (result, orders); // } // catch (Exception e) // { // result.setFail(ServerErrorCode.DynamoDbException, e.Message); // return (result, null); // } // } // // //================================================================================ // // 사파이어 교환 주문 목록을 비동기로 조회한다. // // OrderType과 PlanetId로 검색한다. // // Result, IEnumerable<>를 반환한다. // // 조건에 맞는 값이 없다면 빈 배열을 반환한다. // //================================================================================ // public async Task<(Result, IEnumerable?)> findList_old(string planetId, string userGuid, // ExchangeOrderStatus? orderStatus = null, int pageIndex = 1, int pageSize = 20, CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // if (orderStatus == null) // { // var orders = await m_db_context.SapphireExchangeOrders // .OrderBy(o => o.CreatedAt) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .Where(x => x.PlanetId == planetId && x.UserGuid == userGuid).ToArrayAsync(cancellationToken); // return (result, orders); // } // else // { // var orders = await m_db_context.SapphireExchangeOrders // .Where(x => x.PlanetId == planetId && x.UserGuid == userGuid && x.OrderStatus == orderStatus) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToArrayAsync(cancellationToken); // return (result, orders); // } // } // catch (Exception e) // { // result.setFail(ServerErrorCode.RdbError, e.Message); // return (result, null); // } // } // // public async Task> getSapphireExchangeOrders(int pageIndex, int pageSize) // { // var query = m_db_context.Set().AsNoTracking(); // // var count = await query.CountAsync(); // var items = await query // .OrderBy(o => o.CreatedAt) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToListAsync(); // // return new PaginatedList(items, count, pageIndex, pageSize); // } // // public class PaginatedList : List // { // public int PageIndex { get; private set; } // public int TotalPages { get; private set; } // public int TotalCount { get; private set; } // // public PaginatedList(List items, int count, int pageIndex, int pageSize) // { // PageIndex = pageIndex; // TotalCount = count; // // this.AddRange(items); // } // // public bool HasPreviousPage => PageIndex > 1; // public bool HasNextPage => PageIndex < TotalPages; // } // }