using AutoMapper; using GroupService.Domain.IReposities; using GroupService.WebApi.Application.Dtos; using IM.Commons; using Microsoft.EntityFrameworkCore; namespace GroupService.WebApi.Application.Group { public class GroupService { private readonly IGroupReposity reposity; private readonly IGroupMemberReposity memberReposity; private readonly IMapper mapper; private readonly IM.InitCommon.Management.RuntimePolicy runtime; private readonly global::GroupService.Infrastructure.GroupDbContext db; public GroupService(IGroupReposity reposity, IGroupMemberReposity memberReposity, IMapper mapper, IM.InitCommon.Management.RuntimePolicy runtime, global::GroupService.Infrastructure.GroupDbContext db) { this.reposity = reposity; this.memberReposity = memberReposity; this.mapper = mapper; this.runtime = runtime; this.db = db; } public async Task> CreateAsync(GroupCreateCommand command) { var policy = runtime.Current; if (policy.CreatedGroupLimit > 0 && await db.Groups.CountAsync(x => x.GroupMaster == command.GroupMasterId) >= policy.CreatedGroupLimit) return Result.Fail(ResultCode.PERMISSION_DENIED, "创建群组数量已达到平台上限"); var group = new Domain.Entities.Group(command.GroupMasterId, command.Name); group.Update(null, (Domain.Enums.GroupAuthorityType)policy.DefaultJoinAuthority, null, null); reposity.Create(group); return Result.Success(mapper.Map(group)); } public async Task>> GetAllAsync(Guid userId) { var groups = await reposity.FindByMemberIdAsync(userId); return Result>.Success(mapper.Map>(groups)); } public async Task> GetByIdAsync(Guid groupId, Guid userId) { var group = await reposity.FindByIdAsync(groupId); if (group is null) { return Result.Fail(ResultCode.GROUP_NOT_FOUND); } if (!await memberReposity.CheckMemberExistAsync(groupId, userId)) { return Result.Fail(ResultCode.PERMISSION_DENIED); } return Result.Success(mapper.Map(group)); } public async Task> DissolveAsync(Guid groupId, Guid userId) { var group = await reposity.FindByIdAsync(groupId); if (group is null) { return Result.Fail(ResultCode.GROUP_NOT_FOUND); } if (group.GroupMaster != userId) { return Result.Fail(ResultCode.PERMISSION_DENIED); } var members = await memberReposity.FindByGroupIdAsync(groupId); foreach (var member in members) { member.Leave(); } group.SoftDelete(); return Result.Success(); } public async Task> UpdateAsync(GroupUpdateCommand command) { var group = await reposity.FindByIdAsync(command.GroupId); if(group is null) return Result.Fail(ResultCode.GROUP_NOT_FOUND); var isAdmin = await memberReposity.CheckMemberAdminAsync(group.Id ,command.UserId); if (!isAdmin) return Result.Fail(ResultCode.ADMIN_PERMISSION_DENIED); group.Update(command.GroupName, null, command.Description, command.Avatar); return Result.Success(mapper.Map(group)); } } }