public ActionResult <MilvanethProtocol> AccountStatus([FromQuery] string token) { if (!_token.TryDecode(token, out var payload)) { return(new MilvanethProtocol { Context = null, Data = new AccountStatus { Message = GlobalMessage.OP_TOKEN_NOT_FOUND, ReportTime = _time.SafeNow, } }); } try { if (payload.ValidTo < _time.UtcNow) { return(new MilvanethProtocol { Context = null, Data = new AccountStatus { Message = GlobalMessage.OP_TOKEN_RENEW_REQUIRED, ReportTime = _time.SafeNow, } }); } _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.ACCOUNT_STATUS, 0, out var account); return(new MilvanethProtocol { Context = null, Data = new AccountStatus { Message = GlobalMessage.OK_SUCCESS, ReportTime = _time.SafeNow, DisplayName = account.DisplayName, Email = account.Email, EstiKarma = (int)Helper.EstimateNumber(account.Karma, 3), Username = account.AccountName } }); } catch (Exception e) { Log.Error(e, "Error in ACCOUNT/STATUS"); return(new MilvanethProtocol { Context = null, Data = new AccountStatus { Message = GlobalMessage.OP_INVALID, ReportTime = _time.SafeNow, } }); } }
public ActionResult SessionLogout([FromQuery] string token) { try { _token.TryDecode(token, out var payload); _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.SESSION_LOGOUT, 0, out var account); if (payload.RelatedKey != -1) { var key = _context.KeyStore.Single(x => x.KeyId == payload.RelatedKey); if (key != null && key.ReuseCounter != key.Quota && key.ValidUntil > _time.UtcNow) { key.ReuseCounter = key.Quota; _context.KeyStore.Update(key); _context.ApiLog.Add(new ApiLog { ReportTime = _time.UtcNow, AccountId = account.AccountId, KeyId = key.KeyId, Operation = GlobalOperation.SESSION_LOGOUT, Detail = "Deactivate via session/logout", IpAddress = _accessor.GetIp() }); } } _context.TokenRevocationList.Add(new TokenRevocationList { Reason = GlobalOperation.SESSION_LOGOUT, RevokeSince = _time.UtcNow, TokenSerial = payload.TokenId, }); _context.SaveChanges(); return(StatusCode(200)); } catch (Exception e) { Log.Error(e, "Error in SESSION/LOGOUT"); return(StatusCode(500)); } }
public ActionResult <MilvanethProtocol> DataOverview([FromQuery] string token, int part, MilvanethProtocol data) { if (!_token.TryDecode(token, out var payload)) { return(new MilvanethProtocol { Context = null, Data = new OverviewResponse { Message = GlobalMessage.OP_TOKEN_NOT_FOUND, ReportTime = _time.SafeNow, } }); } if (!(data?.Data is OverviewRequest request) || !request.Check()) { return(new MilvanethProtocol { Context = null, Data = new OverviewResponse { Message = GlobalMessage.DATA_INVALID_INPUT, ReportTime = _time.SafeNow, } }); } try { if (payload.ValidTo < _time.UtcNow) { return(new MilvanethProtocol { Context = null, Data = new OverviewResponse { Message = GlobalMessage.OP_TOKEN_RENEW_REQUIRED, ReportTime = _time.SafeNow, } }); } _auth.EnsureToken(payload, TokenPurpose.AccessToken, GlobalOperation.DATA_OVERVIEW, -15, out _); var query = request.QueryItems.OrderBy(x => x).Skip(part * GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT) .Take(GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT).ToArray(); var param = new NpgsqlParameter <int[]>("query", query); var result = _context.OverviewData.AsNoTracking() .FromSql( $"select record_id, bucket_id, report_time, world, reporter_id, item_id, open_listing, demand from (select *, rank() over (partition by item_id, world order by report_time desc) as ranking from overview_data where item_id = any(@query)) as result_table where ranking = 1", param).Select(x => x.FromDb()).ToList(); return(new MilvanethProtocol { Context = null, Data = new OverviewResponse { Message = GlobalMessage.OK_SUCCESS, ReportTime = _time.SafeNow, EstiTotalParts = request.QueryItems.Length / GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT + 1, FinalPart = part * GlobalConfig.DATA_OVERVIEW_QUERY_LIMIT + query.Count() >= request.QueryItems.Length, PartId = part, Results = result } }); } catch (Exception e) { Log.Error(e, $"Error in DATA/OVERVIEW/{part}"); return(new MilvanethProtocol { Context = null, Data = new OverviewResponse { Message = GlobalMessage.OP_TOKEN_NOT_FOUND, ReportTime = _time.SafeNow, } }); } }