Files
egtbeamwall/EgtBEAMWALL.DataLayer/Controllers/DbController.cs
T
2021-03-06 14:49:25 +01:00

350 lines
9.7 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EgtBEAMWALL.DataLayer.DatabaseModels;
namespace EgtBEAMWALL.DataLayer.Controllers
{
public class ProjController : IDisposable
{
#region Private Fields
private DatabaseContext dbCtx;
#endregion Private Fields
#region Public Constructors
public ProjController()
{
// Initialize database context
dbCtx = new DatabaseContext();
}
#endregion Public Constructors
#region Protected Methods
/// <summary>
/// Get LAST paginated data from DB (DESC ordered)
/// </summary>
/// <param name="numRecord"></param>
/// <returns></returns>
protected List<ProjModel> GetLastDbModelDesc(int numRecord)
{
// se numRecord = 0 --> passo tutti
if (numRecord == 0)
{
numRecord = dbCtx.ProjList.Count();
}
// retrieve
return dbCtx
.ProjList
.OrderByDescending(x => x.ProjId)
.Take(numRecord)
.ToList();
}
/// <summary>
/// Get ProdId by ProdDbId, 0 se non trovato
/// </summary>
/// <param name="ProdDbId"></param>
/// <returns></returns>
protected int ProdIdByProdDbId(int? ProdDbId)
{
int answ = 0;
if (ProdDbId != null)
{
var prodRecord = dbCtx
.ProdList
.Where(x => x.ProdDbId == ProdDbId)
.SingleOrDefault();
if (prodRecord != null)
{
answ = prodRecord.ProdId;
}
}
return answ;
}
#endregion Protected Methods
#region Public Methods
public bool DeleteProj(int ProjId)
{
bool done = false;
var currProj = FindByProjId(ProjId);
// sel delle BTLParts da proj
var parts2del = dbCtx
.BTLPartList
.Where(x => x.ProjDbId == currProj.ProjDbId);
try
{
// remove from database
dbCtx.BTLPartList.RemoveRange(parts2del);
dbCtx.ProjList.Remove(currProj);
// Commit changes
dbCtx.SaveChanges();
done = true;
}
catch (Exception exc)
{
Console.WriteLine($"EXCEPTION on DeleteProj: {exc}");
}
return done;
}
public void Dispose()
{
// Clear database context
dbCtx.Dispose();
}
/// <summary>
/// Get record by ProjDbId
/// </summary>
/// <param name="ProjDbId"></param>
/// <returns></returns>
public ProjModel FindByProjDbId(int ProjDbId)
{
return dbCtx
.ProjList
.Where(x => x.ProjDbId == ProjDbId)
.SingleOrDefault();
}
/// <summary>
/// Get record by ProjId
/// </summary>
/// <param name="ProjId"></param>
/// <returns></returns>
public ProjModel FindByProjId(int ProjId)
{
return dbCtx
.ProjList
.Where(x => x.ProjId == ProjId)
.SingleOrDefault();
}
#if false
/// <summary>
/// Get paginated data from DB (ASC ordered)
/// </summary>
/// <param name="ProjDbIdStart"></param>
/// <param name="numRecord"></param>
/// <returns></returns>
public List<ProjModel> GetPaginatedAsc(int ProjDbIdStart, int numRecord)
{
int numEnd = ProjDbIdStart - numRecord;
// check numEnd
if (numEnd < 0)
numEnd = 0;
// retrieve
return dbCtx
.ProjList
.Where(x => x.ProjDbId <= ProjDbIdStart)
.OrderBy(x => x.ProjDbId)
.Take(numRecord)
.ToList();
}
/// <summary>
/// Get paginated data from DB (DESC ordered)
/// </summary>
/// <param name="PartDbIdStart"></param>
/// <param name="numRecord"></param>
/// <returns></returns>
public List<ProjModel> GetPaginatedDesc(int PartDbIdStart, int numRecord)
{
int numEnd = PartDbIdStart - numRecord;
// check numEnd
if (numEnd < 0)
numEnd = 0;
// retrieve
return dbCtx
.ProjList
.Where(x => x.ProjDbId <= PartDbIdStart)
.OrderByDescending(x => x.ProjDbId)
.Take(numRecord)
.ToList();
}
#endif
/// <summary>
/// Get filtered data by ProjectId (ASC ordered)
/// </summary>
/// <param name="ProdDbId"></param>
/// <returns></returns>
public List<ProjModel> GetByProdAsc(int ProdDbId)
{
// retrieve
return dbCtx
.ProjList
.Where(x => x.ProdDbId == ProdDbId)
.OrderBy(x => x.ProdDbId)
.ToList();
}
/// <summary>
/// Get filtered data by ProjectId (DESC ordered)
/// </summary>
/// <param name="ProdDbId"></param>
/// <returns></returns>
public List<ProjModel> GetByProdDesc(int ProdDbId)
{
// retrieve
return dbCtx
.ProjList
.Where(x => x.ProdDbId == ProdDbId)
.OrderByDescending(x => x.ProdDbId)
.ToList();
}
/// <summary>
/// Elenco progetti
/// </summary>
/// <param name="numRecord"></param>
/// <returns></returns>
public List<Core.ProjectFile> GetLastDesc(int numRecord)
{
List<Core.ProjectFile> result = new List<Core.ProjectFile>();
var dbResult = GetLastDbModelDesc(numRecord);
// conversione
result = dbResult.Select(x => new Core.ProjectFile(Core.ConstBeam.ProjectType.PROJ, x.ProjId, ProdIdByProdDbId(x.ProdDbId), x.BTLFileName)).ToList();
return result;
}
/// <summary>
/// Fornisce nuovo indice VUOTO da usare (allocando sul DB)
/// </summary>
/// <returns></returns>
public int GetNextIndex()
{
int nextId = 0;
// cerco se ne ho ALMENO 1....
var numRec = dbCtx.ProjList.Count();
if (numRec == 0)
{
nextId = 1;
}
else
{
// retrieve ultimo...
var maxRecord = dbCtx
.ProjList
.OrderByDescending(x => x.ProjId)
.Take(1)
.FirstOrDefault();
// incremento
nextId = maxRecord.ProjId + 1;
}
// creo nuovo...
var newRec = dbCtx
.ProjList
.Add(new ProjModel() { ProjId = nextId, BTLFileName = "", Locked = true });
// Commit changes
dbCtx.SaveChanges();
return nextId;
}
/// <summary>
/// Manage Lock by ProjId (proj & prod)
/// </summary>
/// <param name="ProjId">ProjID</param>
/// <param name="Locked">Stato Lock da impostare</param>
/// <returns></returns>
public ProjModel LockByProjId(int ProjId, bool Locked)
{
var currProj = dbCtx
.ProjList
.Where(x => x.ProjId == ProjId)
.SingleOrDefault();
// aggiorno stato
currProj.Locked = Locked;
// seleziono il prod...
var currProd = dbCtx
.ProdList
.Where(x => x.ProdDbId == currProj.ProdDbId)
.SingleOrDefault();
currProd.Locked = Locked;
dbCtx.SaveChanges();
return currProj;
}
/// <summary>
/// Update record su DB x elenco BTLParts
/// </summary>
/// <param name="ProjId"></param>
/// <param name="newBTLFileName"></param>
/// <returns></returns>
public ProjModel UpdateBtlParts(int ProjId, List<Core.BTLPart> BtlPartList)
{
var currData = FindByProjId(ProjId);
// sel delle BTLParts da proj
var items2del = dbCtx
.BTLPartList
.Where(x => x.ProjDbId == currData.ProjDbId);
// converto le BtlParts
var items2add = BtlPartList.Select(x => BTLPartController.ConvertFromCore(x, currData.ProjDbId)).ToList();
try
{
// elimino dal DB
dbCtx.BTLPartList.RemoveRange(items2del);
// aggiungo le nuove
dbCtx.BTLPartList.AddRange(items2add);
}
catch
{ }
// aggiorno valore isNew a false
currData.IsNew = false;
// Commit changes
dbCtx.SaveChanges();
return currData;
}
/// <summary>
/// Update record su DB x nome
/// </summary>
/// <param name="ProjId"></param>
/// <param name="newBTLFileName"></param>
/// <returns></returns>
public ProjModel UpdateName(int ProjId, string newBTLFileName)
{
var currData = FindByProjId(ProjId);
// aggiorno valore BTL
currData.BTLFileName = newBTLFileName;
// Commit changes
dbCtx.SaveChanges();
return currData;
}
#endregion Public Methods
}
}