forked from ddrilling/AsbCloudServer
141 lines
3.9 KiB
C#
141 lines
3.9 KiB
C#
using AsbCloudApp.Data;
|
|
using AsbCloudApp.Data.User;
|
|
using AsbCloudApp.Exceptions;
|
|
using AsbCloudApp.Requests;
|
|
using AsbCloudApp.Services;
|
|
using AsbCloudDb.Model;
|
|
using Mapster;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace AsbCloudInfrastructure.Services;
|
|
|
|
public class WellContactService : IWellContactService
|
|
{
|
|
private readonly IAsbCloudDbContext db;
|
|
|
|
public WellContactService(IAsbCloudDbContext db)
|
|
{
|
|
this.db = db;
|
|
}
|
|
|
|
public async Task<IEnumerable<ContactDto>> GetAllAsync(WellContactRequest request, CancellationToken token)
|
|
{
|
|
var query = db.Contacts
|
|
.Where(c => request.IdsWells.Contains(c.IdWell));
|
|
|
|
if (request.ContactTypeId.HasValue)
|
|
{
|
|
query = query.Where(c => c.IdCompanyType == request.ContactTypeId);
|
|
};
|
|
|
|
var entities = await query.AsNoTracking()
|
|
.ToArrayAsync(token);
|
|
|
|
var dtos = entities.Select(c => c.Adapt<ContactDto>());
|
|
|
|
return dtos;
|
|
}
|
|
|
|
public async Task<ContactDto?> GetAsync(int idWell, int id, CancellationToken token)
|
|
{
|
|
var dbContact = await GetContact(idWell, id, token);
|
|
|
|
var result = dbContact?.Adapt<ContactDto>();
|
|
|
|
return result;
|
|
}
|
|
|
|
public async Task<IEnumerable<CompanyTypeDto>> GetTypesAsync(CancellationToken token)
|
|
{
|
|
var query = db.CompaniesTypes
|
|
.Where(t => t.IsContact)
|
|
.OrderBy(t => t.Order);
|
|
|
|
var entities = await query.AsNoTracking()
|
|
.ToArrayAsync(token);
|
|
|
|
var dtos = entities.Adapt<IEnumerable<CompanyTypeDto>>();
|
|
|
|
return dtos;
|
|
}
|
|
|
|
public async Task<int> InsertAsync(ContactDto contactDto, CancellationToken token)
|
|
{
|
|
var entity = contactDto.Adapt<Contact>();
|
|
|
|
db.Contacts.Add(entity);
|
|
|
|
await db.SaveChangesAsync(token).ConfigureAwait(false);
|
|
return entity.Id;
|
|
}
|
|
|
|
|
|
public async Task<int> UpdateAsync(ContactDto contactDto, CancellationToken token)
|
|
{
|
|
var dbContact = await GetContact(contactDto.IdWell, contactDto.Id, token);
|
|
if (dbContact is null)
|
|
throw new ForbidException("Contact doesn't exist");
|
|
|
|
var entity = contactDto.Adapt<Contact>();
|
|
db.Contacts.Update(entity);
|
|
|
|
return await db.SaveChangesAsync(token);
|
|
}
|
|
|
|
public async Task<int> DeleteAsync(int idWell, int id, CancellationToken token)
|
|
{
|
|
var dbContact = await GetContact(idWell, id, token);
|
|
if (dbContact is null)
|
|
throw new ForbidException("Contact doesn't exist");
|
|
|
|
db.Contacts.Remove(dbContact);
|
|
return await db.SaveChangesAsync(token);
|
|
}
|
|
|
|
public async Task<int> CopyAsync(int idWell, int idWellTarget, IEnumerable<int> contactIds, CancellationToken token)
|
|
{
|
|
var contacts = await GetContacts(idWell, contactIds, token);
|
|
if (!contacts.Any())
|
|
return 0;
|
|
|
|
var newContacts = contacts.Select(contact =>
|
|
{
|
|
var newContact = contact.Adapt<Contact>();
|
|
newContact.IdWell = idWellTarget;
|
|
newContact.Id = default;
|
|
|
|
return newContact;
|
|
});
|
|
|
|
db.Contacts.AddRange(newContacts);
|
|
|
|
return await db.SaveChangesAsync(token);
|
|
}
|
|
|
|
private async Task<Contact?> GetContact(int idWell, int idContact, CancellationToken token)
|
|
{
|
|
var contact = await db.Contacts
|
|
.Where(c => c.IdWell == idWell)
|
|
.Where(c => c.Id == idContact)
|
|
.AsNoTracking()
|
|
.FirstOrDefaultAsync(token);
|
|
|
|
return contact;
|
|
}
|
|
|
|
private async Task<Contact[]> GetContacts(int idWell, IEnumerable<int> contactIds, CancellationToken token)
|
|
{
|
|
var contacts = await db.Contacts
|
|
.Where(c => c.IdWell == idWell)
|
|
.Where(c => contactIds.Contains(c.Id))
|
|
.AsNoTracking()
|
|
.ToArrayAsync(token);
|
|
|
|
return contacts;
|
|
}
|
|
}
|