feat(apiv2): group member endpoints
This commit is contained in:
		@@ -1,7 +1,10 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					using Dapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using Microsoft.AspNetCore.Mvc;
 | 
					using Microsoft.AspNetCore.Mvc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using Newtonsoft.Json.Linq;
 | 
					using Newtonsoft.Json.Linq;
 | 
				
			||||||
@@ -59,58 +62,195 @@ namespace PluralKit.API
 | 
				
			|||||||
            return Ok(o);
 | 
					            return Ok(o);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpPut("groups/{group_id}/members/{member_id}")]
 | 
					        [HttpPut("groups/{groupRef}/members/{memberRef}")]
 | 
				
			||||||
        public async Task<IActionResult> GroupMemberPut(string group_id, string member_id)
 | 
					        public async Task<IActionResult> GroupMemberPut(string groupRef, string memberRef)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
            {
 | 
					
 | 
				
			||||||
                StatusCode = 501
 | 
					            var group = await ResolveGroup(groupRef);
 | 
				
			||||||
            };
 | 
					            if (group == null)
 | 
				
			||||||
 | 
					                throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					            if (group.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnGroupError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					            Console.WriteLine(member);
 | 
				
			||||||
 | 
					            if (member == null)
 | 
				
			||||||
 | 
					                throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					            if (member.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnMemberError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var existingMembers = await _repo.GetGroupMembers(group.Id).Select(x => x.Id).ToListAsync();
 | 
				
			||||||
 | 
					            if (!existingMembers.Contains(member.Id))
 | 
				
			||||||
 | 
					                await _repo.AddMembersToGroup(group.Id, new List<MemberId>() { member.Id });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpPut("groups/{group_id}/members")]
 | 
					        [HttpPut("groups/{groupRef}/members")]
 | 
				
			||||||
        public async Task<IActionResult> GroupMembersPut(string group_id, [FromBody] JArray members)
 | 
					        public async Task<IActionResult> GroupMembersPut(string groupRef, [FromBody] JArray memberRefs)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            if (memberRefs.Count == 0)
 | 
				
			||||||
 | 
					                throw APIErrors.GenericBadRequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var group = await ResolveGroup(groupRef);
 | 
				
			||||||
 | 
					            if (group == null)
 | 
				
			||||||
 | 
					                throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					            if (group.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnGroupError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var members = new List<MemberId>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach (var JmemberRef in memberRefs)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                StatusCode = 501
 | 
					                var memberRef = JmemberRef.Value<string>();
 | 
				
			||||||
            };
 | 
					                var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (member == null)
 | 
				
			||||||
 | 
					                    throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					                if (member.System != system.Id)
 | 
				
			||||||
 | 
					                    throw APIErrors.NotOwnMemberErrorWithRef(memberRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                members.Add(member.Id);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var existingMembers = await _repo.GetGroupMembers(group.Id).Select(x => x.Id).ToListAsync();
 | 
				
			||||||
 | 
					            members = members.Where(x => !existingMembers.Contains(x)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (members.Count > 0)
 | 
				
			||||||
 | 
					                await _repo.AddMembersToGroup(group.Id, members);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpDelete("groups/{group_id}/members/{member_id}")]
 | 
					        [HttpDelete("groups/{groupRef}/members/{memberRef}")]
 | 
				
			||||||
        public async Task<IActionResult> GroupMemberDelete(string group_id, string member_id)
 | 
					        public async Task<IActionResult> GroupMemberDelete(string groupRef, string memberRef)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
            {
 | 
					
 | 
				
			||||||
                StatusCode = 501
 | 
					            var group = await ResolveGroup(groupRef);
 | 
				
			||||||
            };
 | 
					            if (group == null)
 | 
				
			||||||
 | 
					                throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					            if (group.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnGroupError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					            if (member == null)
 | 
				
			||||||
 | 
					                throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					            if (member.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnMemberError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await _repo.RemoveMembersFromGroup(group.Id, new List<MemberId>() { member.Id });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpDelete("groups/{group_id}/members")]
 | 
					        [HttpDelete("groups/{groupRef}/members")]
 | 
				
			||||||
        public async Task<IActionResult> GroupMembersDelete(string group_id, [FromBody] JArray members)
 | 
					        public async Task<IActionResult> GroupMembersDelete(string groupRef, [FromBody] JArray memberRefs)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            if (memberRefs.Count == 0)
 | 
				
			||||||
 | 
					                throw APIErrors.GenericBadRequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var group = await ResolveGroup(groupRef);
 | 
				
			||||||
 | 
					            if (group == null)
 | 
				
			||||||
 | 
					                throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					            if (group.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnGroupError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var members = new List<MemberId>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach (var JmemberRef in memberRefs)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                StatusCode = 501
 | 
					                var memberRef = JmemberRef.Value<string>();
 | 
				
			||||||
            };
 | 
					                var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (member == null)
 | 
				
			||||||
 | 
					                    throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					                if (member.System != system.Id)
 | 
				
			||||||
 | 
					                    throw APIErrors.NotOwnMemberError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                members.Add(member.Id);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await _repo.RemoveMembersFromGroup(group.Id, members);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpPut("members/{member_id}/groups")]
 | 
					        [HttpPut("members/{memberRef}/groups")]
 | 
				
			||||||
        public async Task<IActionResult> MemberGroupsPut(string member_id, [FromBody] JArray groups)
 | 
					        public async Task<IActionResult> MemberGroupsPut(string memberRef, [FromBody] JArray groupRefs)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            if (groupRefs.Count == 0)
 | 
				
			||||||
 | 
					                throw APIErrors.GenericBadRequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					            if (member == null)
 | 
				
			||||||
 | 
					                throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					            if (member.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnMemberError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var groups = new List<GroupId>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach (var JgroupRef in groupRefs)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                StatusCode = 501
 | 
					                var groupRef = JgroupRef.Value<string>();
 | 
				
			||||||
            };
 | 
					                var group = await ResolveGroup(groupRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (group == null)
 | 
				
			||||||
 | 
					                    throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					                if (group.System != system.Id)
 | 
				
			||||||
 | 
					                    throw APIErrors.NotOwnGroupErrorWithRef(groupRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                groups.Add(group.Id);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var existingGroups = await _repo.GetMemberGroups(member.Id).Select(x => x.Id).ToListAsync();
 | 
				
			||||||
 | 
					            groups = groups.Where(x => !existingGroups.Contains(x)).ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (groups.Count > 0)
 | 
				
			||||||
 | 
					                await _repo.AddGroupsToMember(member.Id, groups);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [HttpDelete("members/{member_id}/groups")]
 | 
					        [HttpDelete("members/{memberRef}/groups")]
 | 
				
			||||||
        public async Task<IActionResult> MemberGroupsDelete(string member_id, [FromBody] JArray groups)
 | 
					        public async Task<IActionResult> MemberGroupsDelete(string memberRef, [FromBody] JArray groupRefs)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            return new ObjectResult("Unimplemented")
 | 
					            if (groupRefs.Count == 0)
 | 
				
			||||||
 | 
					                throw APIErrors.GenericBadRequest;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var system = await ResolveSystem("@me");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var member = await ResolveMember(memberRef);
 | 
				
			||||||
 | 
					            if (member == null)
 | 
				
			||||||
 | 
					                throw APIErrors.MemberNotFound;
 | 
				
			||||||
 | 
					            if (member.System != system.Id)
 | 
				
			||||||
 | 
					                throw APIErrors.NotOwnMemberError;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var groups = new List<GroupId>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            foreach (var JgroupRef in groupRefs)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                StatusCode = 501
 | 
					                var groupRef = JgroupRef.Value<string>();
 | 
				
			||||||
            };
 | 
					                var group = await ResolveGroup(groupRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (group == null)
 | 
				
			||||||
 | 
					                    throw APIErrors.GroupNotFound;
 | 
				
			||||||
 | 
					                if (group.System != system.Id)
 | 
				
			||||||
 | 
					                    throw APIErrors.NotOwnGroupErrorWithRef(groupRef);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                groups.Add(group.Id);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            await _repo.RemoveGroupsFromMember(member.Id, groups);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return NoContent();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -51,9 +51,12 @@ namespace PluralKit.API
 | 
				
			|||||||
        public static PKError UnauthorizedGroupList = new(403, 30002, "Unauthorized to view group list");
 | 
					        public static PKError UnauthorizedGroupList = new(403, 30002, "Unauthorized to view group list");
 | 
				
			||||||
        public static PKError UnauthorizedGroupMemberList = new(403, 30003, "Unauthorized to view group member list");
 | 
					        public static PKError UnauthorizedGroupMemberList = new(403, 30003, "Unauthorized to view group member list");
 | 
				
			||||||
        public static PKError UnauthorizedCurrentFronters = new(403, 30004, "Unauthorized to view current fronters.");
 | 
					        public static PKError UnauthorizedCurrentFronters = new(403, 30004, "Unauthorized to view current fronters.");
 | 
				
			||||||
        public static PKError UnauthorizedFrontHistory = new(403, 30004, "Unauthorized to view front history.");
 | 
					        public static PKError UnauthorizedFrontHistory = new(403, 30005, "Unauthorized to view front history.");
 | 
				
			||||||
        public static PKError NotOwnMemberError = new(403, 40001, "Target member is not part of your system.");
 | 
					        public static PKError NotOwnMemberError = new(403, 40001, "Target member is not part of your system.");
 | 
				
			||||||
        public static PKError NotOwnGroupError = new(403, 40002, "Target group is not part of your system.");
 | 
					        public static PKError NotOwnGroupError = new(403, 40002, "Target group is not part of your system.");
 | 
				
			||||||
 | 
					        // todo: somehow add the memberRef to the JSON
 | 
				
			||||||
 | 
					        public static PKError NotOwnMemberErrorWithRef(string memberRef) => new(403, 40003, $"Member '{memberRef}' is not part of your system.");
 | 
				
			||||||
 | 
					        public static PKError NotOwnGroupErrorWithRef(string groupRef) => new(403, 40004, $"Group '{groupRef}' is not part of your system.");
 | 
				
			||||||
        public static PKError Unimplemented = new(501, 50001, "Unimplemented");
 | 
					        public static PKError Unimplemented = new(501, 50001, "Unimplemented");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user