private static async Task GetMemberRoleIds(HttpContext ctx, ValourDB db, ulong planet_id, ulong user_id, [FromHeader] string 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; } ServerPlanet planet = await db.Planets.Include(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .FirstOrDefaultAsync(x => x.Id == planet_id); if (planet == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Planet not found [id: {planet_id.ToString()}]"); return; } ServerPlanetMember member = planet.Members.FirstOrDefault(); if (member == null) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Member not found"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.View, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.View"); return; } ServerPlanetMember target = await db.PlanetMembers.Include(x => x.RoleMembership.OrderBy(x => x.Role.Position)) .ThenInclude(x => x.Role) .FirstOrDefaultAsync(x => x.Planet_Id == planet_id && x.User_Id == user_id); if (target == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Member not found [user_id: {user_id.ToString()}, planet_id: {planet_id.ToString()}"); return; } ctx.Response.StatusCode = 200; await ctx.Response.WriteAsJsonAsync(target.RoleMembership.Select(x => x.Role_Id)); return; }
private static async Task GetRoles(HttpContext ctx, ValourDB db, ulong planet_id, [FromHeader] string authorization) { ServerAuthToken auth = await ServerAuthToken.TryAuthorize(authorization, db); if (auth == null) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Token is invalid"); return; } ServerPlanet planet = await db.Planets .Include(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .Include(x => x.Roles) .FirstOrDefaultAsync(x => x.Id == planet_id); if (planet == null) { ctx.Response.StatusCode = 404; await ctx.Response.WriteAsync($"Planet not found [id: {planet_id.ToString()}]"); return; } var member = planet.Members.FirstOrDefault(); if (member == null) { ctx.Response.StatusCode = 403; await ctx.Response.WriteAsync($"Member not found"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.View, db)) { ctx.Response.StatusCode = 403; await ctx.Response.WriteAsync($"Member lacks PlanetPermissions.View"); return; } ctx.Response.StatusCode = 200; await ctx.Response.WriteAsJsonAsync(planet.Roles); }
private static async Task CreateCategory(HttpContext ctx, ValourDB db, [FromHeader] string authorization) { ServerPlanetCategory category_data = await JsonSerializer.DeserializeAsync <ServerPlanetCategory>(ctx.Request.Body); if (category_data == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync("Please include category in body"); return; } if (string.IsNullOrWhiteSpace(category_data.Name)) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync("Please include a category name"); return; } // Request parameter validation // TaskResult name_valid = ServerPlanetCategory.ValidateName(category_data.Name); if (!name_valid.Success) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Name is not valid [name: {category_data.Name}]"); return; } // Request authorization // AuthToken auth = await ServerAuthToken.TryAuthorize(authorization, db); if (!auth.HasScope(UserPermissions.PlanetManagement)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Token lacks UserPermissions.PlanetManagement scope"); return; } ServerPlanet planet = await db.Planets.Include(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .FirstOrDefaultAsync(x => x.Id == category_data.Planet_Id); var member = planet.Members.FirstOrDefault(); if (!await planet.HasPermissionAsync(member, PlanetPermissions.ManageChannels, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.ManageChannels node"); return; } // Ensure parent category exists ulong?parent_id = null; ServerPlanetCategory parent = await db.PlanetCategories.FindAsync(category_data.Parent_Id); ushort child_count = 0; if (parent != null) { parent_id = parent.Id; if (parent.Planet_Id != planet.Id) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync("Parent id does not match planet"); return; } child_count += (ushort)await db.PlanetChatChannels.CountAsync(x => x.Parent_Id == parent_id); child_count += (ushort)await db.PlanetCategories.CountAsync(x => x.Parent_Id == parent_id); } // Request action // // Creates the category ServerPlanetCategory category = new ServerPlanetCategory() { Id = IdManager.Generate(), Name = category_data.Name, Planet_Id = category_data.Planet_Id, Parent_Id = category_data.Parent_Id, Description = category_data.Description, Position = child_count }; // Add channel to database await db.PlanetCategories.AddAsync(category); // Save changes to DB await db.SaveChangesAsync(); // Send channel refresh PlanetHub.NotifyCategoryChange(category); ctx.Response.StatusCode = 201; await ctx.Response.WriteAsync(category.Id.ToString()); }
private static async Task Public(HttpContext ctx, ValourDB db, ulong planet_id, [FromHeader] string 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; } ServerPlanet planet = await db.Planets.Include(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .FirstOrDefaultAsync(x => x.Id == planet_id); if (planet == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Planet not found [id: {planet_id}]"); return; } ServerPlanetMember member = planet.Members.FirstOrDefault(); if (member == null) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Member not found"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.View, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.View"); return; } switch (ctx.Request.Method) { case "GET": { ctx.Response.StatusCode = 200; await ctx.Response.WriteAsJsonAsync(planet.Public); return; } case "PUT": { if (!auth.HasScope(UserPermissions.PlanetManagement)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Token lacks UserPermissions.PlanetManagement"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.Manage, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.Manage"); return; } string body = await ctx.Request.ReadBodyStringAsync(); bool parsed = false; parsed = bool.TryParse(body, out var in_public); if (!parsed) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync("Failed to parse body"); return; } var result = await planet.TrySetPublicAsync(in_public, db); if (!result.Success) { ctx.Response.StatusCode = 400; } else { ctx.Response.StatusCode = 200; } await ctx.Response.WriteAsync(result.Message); return; } } }
private static async Task PrimaryChannel(HttpContext ctx, ValourDB db, ulong planet_id, [FromHeader] string 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; } ServerPlanet planet = await db.Planets.Include(x => x.Members.Where(x => x.User_Id == auth.User_Id)) .FirstOrDefaultAsync(x => x.Id == planet_id); if (planet == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Planet not found [id: {planet_id}]"); return; } ServerPlanetMember member = planet.Members.FirstOrDefault(); if (member == null) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Member not found"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.View, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.View"); return; } switch (ctx.Request.Method) { case "GET": { ServerPlanetChatChannel mainChannel = await db.PlanetChatChannels.FindAsync(planet.Main_Channel_Id); if (mainChannel == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Main channel not found [id: {planet.Main_Channel_Id}]\n" + $"Bug a developer, this should not happen."); return; } ctx.Response.StatusCode = 200; await ctx.Response.WriteAsJsonAsync(mainChannel); return; } case "PUT": { if (!auth.HasScope(UserPermissions.PlanetManagement)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync($"Token lacks UserPermissions.PlanetManagement"); return; } if (!await planet.HasPermissionAsync(member, PlanetPermissions.Manage, db)) { ctx.Response.StatusCode = 401; await ctx.Response.WriteAsync("Member lacks PlanetPermissions.Manage"); return; } string body = await ctx.Request.ReadBodyStringAsync(); ServerPlanetChatChannel in_channel = JsonSerializer.Deserialize <ServerPlanetChatChannel>(body); if (in_channel == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Could not deserialize channel"); return; } ServerPlanetChatChannel channel = await db.PlanetChatChannels.FindAsync(in_channel.Id); if (channel == null) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Could not find channel [id: {in_channel.Id}]"); return; } if (channel.Planet.Id != planet.Id) { ctx.Response.StatusCode = 400; await ctx.Response.WriteAsync($"Channel belongs to different planet"); return; } planet.Main_Channel_Id = channel.Id; await db.SaveChangesAsync(); ctx.Response.StatusCode = 200; await ctx.Response.WriteAsync("Success"); return; } } }