using AutoMapper; using Common.Dtos.Exper; using Common.Dtos.Group; using Hushian.Application.Contracts.Persistence; using Hushian.Application.Models; using Common.Validation; using Hushian.Domain.Entites; using Microsoft.EntityFrameworkCore; namespace Hushian.Application.Services { public class GroupService { private readonly IGenericRepository _GroupRepository; private readonly IGenericRepository _EGRepository; private readonly IMapper _mapper; private readonly ExperService _experService; public GroupService(IGenericRepository groupRepository , IGenericRepository eGRepository , IMapper mapper, ExperService experService) { _GroupRepository = groupRepository; _EGRepository = eGRepository; _mapper = mapper; _experService = experService; } public async Task> NewGroup(ADD_GroupDto model, int CompanyID) { ResponseBase Response = new(); if (!model.Name.IsOnlyPersianLetters()) Response.Errors.Add("نام باید کاملا به صورت فارسی باشد"); else if (!string.IsNullOrEmpty(model.Info) && !model.Info.IsOnlyPersianLetters()) Response.Errors.Add("توضیحات باید کاملا به صورت فارسی باشد"); else if (model.img != null && !model.img.IsValidImage()) Response.Errors.Add("تصویر نمی تواند از 5 مگ بیشتر باشد"); else { var nGroup = _mapper.Map(model); nGroup.CompanyID = CompanyID; Response.Value = await _GroupRepository.ADDBool(nGroup); if (Response.Value) Response.Success = true; else { Response.Errors.Add("خطا در ذخیره سازی"); } } return Response; } public async Task> GetGroupsCompany(int CompanyID) { var entity = await _GroupRepository.Get().Where(f => f.CompanyID == CompanyID).ToListAsync(); return _mapper.Map>(entity); } public async Task> GetGroupsExper(int ExperID) { var entity = await _GroupRepository.Get().Where(f => f.EG.Any(a=>a.ExperID==ExperID)).ToListAsync(); return _mapper.Map>(entity); } public async Task> UpdateGroup(Update_GroupDto model, int CompanyID) { ResponseBase Response = new(); if (!model.Name.IsOnlyPersianLetters()) Response.Errors.Add("نام باید کاملا به صورت فارسی باشد"); else if (!string.IsNullOrEmpty(model.Info) && !model.Info.IsOnlyPersianLetters()) Response.Errors.Add("توضیحات باید کاملا به صورت فارسی باشد"); else if (model.img != null && !model.img.IsValidImage()) Response.Errors.Add("تصویر نمی تواند از 5 مگ بیشتر باشد"); else { try { var entity = await _GroupRepository.Get().FirstOrDefaultAsync(f => f.ID == model.ID && f.CompanyID == CompanyID); entity.Name = model.Name; entity.Info = model.Info; entity.img = model.img; Response.Value = await _GroupRepository.UPDATEBool(entity); if (Response.Value) Response.Success = true; else { Response.Errors.Add("خطا در ذخیره سازی"); } } catch (Exception ex) { Response.Errors.Add("خطای سیستمی"); } } return Response; } public async Task ChangeAvailableGroup(ChangeAvailable_GroupDto model, int CompanyID) { try { var entity = await _GroupRepository.Get().FirstOrDefaultAsync(f => f.ID == model.ID && f.CompanyID == CompanyID); entity.Available = model.Available; return await _GroupRepository.UPDATEBool(entity); } catch (Exception ex) { return false; } } public async Task> DeleteGroup(int GroupID,int CompanyID) { ResponseBase Response = new(); var Group = await _GroupRepository.Get().FirstOrDefaultAsync(a => a.CompanyID == CompanyID && a.ID == GroupID); if (Group!=null) Response.Value=Response.Success= await _GroupRepository.DELETE(Group); else Response.Errors.Add("یافت نشد"); return Response; } public async Task> JoinExperInGroup(int GroupID, int ExperID, int CompanyID) { ResponseBase Response = new(); if (await CHeckGroupMemberCompany(GroupID,CompanyID)) { if (await _experService.CheckExperInCompany(CompanyID,ExperID)) { Response.Value=Response.Success= await _EGRepository.ADDBool(new ExperGroup() { ExperID = ExperID, GroupID = GroupID }); } else Response.Errors.Add("کارشناس یافت نشد"); } else Response.Errors.Add("گروه یافت نشد"); return Response; } public async Task> UnJoinExperInGroup(int GroupID, int ExperID, int CompanyID) { ResponseBase Response = new(); if (await CHeckGroupMemberCompany(GroupID, CompanyID)) { if (await _experService.CheckExperInCompany(CompanyID, ExperID)) { try { var eg =await _EGRepository.Get().FirstOrDefaultAsync(w=>w.GroupID==GroupID && w.ExperID==ExperID); Response.Value = Response.Success = eg==null ? true : await _EGRepository.DELETE(eg); } catch (Exception) { throw; } } else Response.Errors.Add("کارشناس یافت نشد"); } else Response.Errors.Add("گروه یافت نشد"); return Response; } public async Task AnyGroup(int GroupID) => await _GroupRepository.Get().AnyAsync(a=>a.ID==GroupID); public async Task CHeckGroupMemberCompany(int GroupID, int CompanyID)=> await _GroupRepository.Get().AnyAsync(a => a.CompanyID == CompanyID && a.ID == GroupID); public async Task> GetExpersFromGroupID(int GroupID) => _mapper.Map>( await _EGRepository.Get().Where(w => w.GroupID == GroupID).Select(s=>s.Exper).ToListAsync()); } }