using Microsoft.EntityFrameworkCore; using ServerBase; using ServerCommon; namespace BrokerCore.Repository; using DbEntity; using Context; public class PlanetItemExchangeOrderAmountUserLimitRepo { private readonly MetaverseBrokerDbContext m_db_context; public PlanetItemExchangeOrderAmountUserLimitRepo(MetaverseBrokerDbContext dbContext) { m_db_context = dbContext; } // 사용자별 교환 제한 추가 public async Task add(PlanetItemExchangeOrderAmountUserLimit limit, CancellationToken cancellationToken = default) { var result = new Result(); try { m_db_context.PlanetItemExchangeOrderAmountUserLimits.Add(limit); await m_db_context.SaveChangesAsync(cancellationToken); } catch (Exception e) { result.setFail(ServerErrorCode.InternalServerError, e.Message); } return result; } // 사용자별 교환 제한 업데이트 public async Task update(PlanetItemExchangeOrderAmountUserLimit limit, CancellationToken cancellationToken = default) { var result = new Result(); try { m_db_context.PlanetItemExchangeOrderAmountUserLimits.Update(limit); await m_db_context.SaveChangesAsync(cancellationToken); } catch (Exception e) { result.setFail(ServerErrorCode.InternalServerError, e.Message); } return result; } // 사용자별 교환 제한 삭제 public async Task delete(PlanetItemExchangeOrderAmountUserLimit limit, CancellationToken cancellationToken = default) { var result = new Result(); try { m_db_context.PlanetItemExchangeOrderAmountUserLimits.Remove(limit); await m_db_context.SaveChangesAsync(cancellationToken); } catch (Exception e) { result.setFail(ServerErrorCode.InternalServerError, e.Message); } return result; } // 특정 사용자와 날짜에 대한 교환 제한 조회 public async Task<(Result, PlanetItemExchangeOrderAmountUserLimit?)> findByUserAndDate( string exchangeMetaId, string userGuid, DateOnly exchangeDate, string seasonId, CancellationToken cancellationToken = default) { var result = new Result(); try { var limit = await m_db_context.PlanetItemExchangeOrderAmountUserLimits .Where(x => x.ExchangeMetaId == exchangeMetaId && x.ExchangeDate == exchangeDate && x.SeasonId == seasonId && x.UserGuid == userGuid) .FirstOrDefaultAsync(cancellationToken); return (result, limit); } catch (Exception e) { result.setFail(ServerErrorCode.RdbError, e.Message); return (result, null); } } // // 특정 교환 메타 아이디에 대한 모든 교환 제한 조회 // public async Task<(Result, IEnumerable?)> findByExchangeMeta( // string exchangeMetaId, // int pageIndex = 1, // int pageSize = 20, // CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // var limits = await m_db_context.PlanetItemExchangeOrderAmountUserLimits // .Where(x => x.ExchangeMetaId == exchangeMetaId) // .OrderBy(x => x.ExchangeDate) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToArrayAsync(cancellationToken); // // return (result, limits); // } // catch (Exception e) // { // result.setFail(ServerErrorCode.RdbError, e.Message); // return (result, null); // } // } // // // 특정 날짜에 대한 모든 교환 제한 조회 // public async Task<(Result, IEnumerable?)> findByDate( // DateOnly exchangeDate, // int pageIndex = 1, // int pageSize = 20, // CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // var limits = await m_db_context.PlanetItemExchangeOrderAmountUserLimits // .Where(x => x.ExchangeDate == exchangeDate) // .OrderBy(x => x.ExchangeMetaId) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToArrayAsync(cancellationToken); // // return (result, limits); // } // catch (Exception e) // { // result.setFail(ServerErrorCode.RdbError, e.Message); // return (result, null); // } // } // // // 특정 사용자의 모든 교환 제한 조회 // public async Task<(Result, IEnumerable?)> findByUser( // string userGuid, // int pageIndex = 1, // int pageSize = 20, // CancellationToken cancellationToken = default) // { // var result = new Result(); // try // { // var limits = await m_db_context.PlanetItemExchangeOrderAmountUserLimits // .Where(x => x.UserGuid == userGuid) // .OrderBy(x => x.ExchangeDate) // .ThenBy(x => x.ExchangeMetaId) // .Skip((pageIndex - 1) * pageSize) // .Take(pageSize) // .ToArrayAsync(cancellationToken); // // return (result, limits); // } // catch (Exception e) // { // result.setFail(ServerErrorCode.RdbError, e.Message); // return (result, null); // } // } public async Task increaseDailyAmount(PlanetItemExchangeOrderAmountUserLimit userLimit, int increaseAmount, CancellationToken cancellationToken) { userLimit.DailyAmount += increaseAmount; var entry = m_db_context.Entry(userLimit); entry.Property(x => x.DailyAmount).IsModified = true; await update(userLimit, cancellationToken); } public async Task<(Result, PlanetItemExchangeOrderAmountUserLimit?)> findByExchangeMetaAndDateOrCreate( string orderExchangeMetaId, string orderUserGuid, DateOnly exchangeDate, string orderSeasonId, CancellationToken cancellationToken) { var result = new Result(); try { var limit = await m_db_context.PlanetItemExchangeOrderAmountUserLimits .Where(x => x.ExchangeMetaId == orderExchangeMetaId && x.ExchangeDate == exchangeDate && x.SeasonId == orderSeasonId && x.UserGuid == orderUserGuid) .FirstOrDefaultAsync(cancellationToken); if (limit is null) { limit = new PlanetItemExchangeOrderAmountUserLimit { ExchangeMetaId = orderExchangeMetaId, UserGuid = orderUserGuid, ExchangeDate = exchangeDate, SeasonId = orderSeasonId, DailyAmount = 0, }; await add(limit, cancellationToken); } return (result, limit); } catch (Exception e) { result.setFail(ServerErrorCode.RdbError, e.Message); return (result, null); } } }