public async Task <IEnumerable <PlanetMessage> > GetLastMessages(ulong channel_id, int count = 10) { // Prevent requesting a ridiculous amount of messages if (count > 64) { count = 64; } List <PlanetMessage> staged = PlanetMessageWorker.GetStagedMessages(channel_id, count); List <PlanetMessage> messages = null; count = count - staged.Count; if (count > 0) { await Task.Run(() => { messages = Context.PlanetMessages.Where(x => x.Channel_Id == channel_id) .OrderByDescending(x => x.Message_Index) .Take(count) .Reverse() .ToList(); }); messages.AddRange(staged); } return(messages); }
private static async Task GetMessages(HttpContext ctx, ValourDB db, ulong channel_id, [FromHeader] string authorization, ulong index = ulong.MaxValue, int count = 10) { // Request parameter validation // if (count > 64) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync("Max count is 64"); return; } // Request authorization // AuthToken auth = await ServerAuthToken.TryAuthorize(authorization, db); if (auth == null) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Token is invalid [token: {authorization}]"); return; } ServerPlanetChatChannel channel = await db.PlanetChatChannels.Include(x => x.Planet) .ThenInclude(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .FirstOrDefaultAsync(x => x.Id == channel_id); var member = channel.Planet.Members.FirstOrDefault(); if (member == null || !await channel.HasPermission(member, ChatChannelPermissions.ViewMessages, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks ChatChannelPermissions.ViewMessages node"); return; } List <PlanetMessage> staged = PlanetMessageWorker.GetStagedMessages(channel_id, count); List <PlanetMessage> messages = null; count = count - staged.Count; if (count > 0) { await Task.Run(() => { messages = db.PlanetMessages.Where(x => x.Channel_Id == channel_id && x.Message_Index < index) .OrderByDescending(x => x.Message_Index) .Take(count) .Reverse() .ToList(); }); messages.AddRange(staged.Where(x => x.Message_Index < index)); } ctx.Response.StatusCode = 200; await ctx.Response.WriteAsJsonAsync(messages); }