using DocumentFormat.OpenXml.Spreadsheet; using FamilyTreeAPI.Entities; using FamilyTreeAPI.Interface; using FamilyTreeAPI.Models; using SpreadsheetLight; namespace FamilyTreeAPI.Repository; public class ImportPersonRepository { enum enumIdx { Id = 1, FirstName, LastName, Email, Phone, Image, Sex, Address, Alive, Dob, FatherId, MotherId, } private FamilyTreeDBContext _context; private IConfiguration _config; private IHttpContextAccessor _httpContext; private IRelationShipd _relationship; public ImportPersonRepository(IConfiguration config, FamilyTreeDBContext context, IRelationShipd relationship, IHttpContextAccessor httpContext) { _context = context; _relationship = relationship; _config = config; _httpContext = httpContext; } public async Task GetImageAsBase64String(string imagePath) { try { // Read the image file into a byte array //byte[] imageBytes = File.ReadAllBytes(imagePath); byte[] imageBytes = await File.ReadAllBytesAsync(imagePath); // Convert the byte array to a Base64 string string base64String = Convert.ToBase64String(imageBytes); return base64String; } catch (FileNotFoundException) { Console.WriteLine($"Error: The file at '{imagePath}' was not found."); return null; } catch (Exception ex) { Console.WriteLine($"An error occurred: {ex.Message}"); return null; } } public async Task> DownloadFile(DownloadFileCriteria criteria) { int statusCode = -1; string result = ""; string error = ""; try { string imagePath = _config.GetValue("AppSettings:ImageFolder"); string imageUrl = System.IO.Path.Combine(imagePath, criteria.FileName); if (System.IO.File.Exists(imageUrl)) { result = await this.GetImageAsBase64String(imageUrl); statusCode = 1; } else { error = "error filename " + criteria.FileName + " can not find in this folder:" + imagePath; statusCode = -1; } } catch (Exception ex) { statusCode = -1; error = ex.Message; } return new ResultModel { Data = result, StatusCode = statusCode, Message = error }; } public async Task>> ImportPerson(MemoryStream fileStream, string sheetName) { Dictionary relationDic = new(); int id; string keypair = ""; //father and mother key List> output = new(); Dictionary updateperson = new(); CodeDto colums; List ids = new(); Person person; Person? uperson; ImportRelation iRelation; MappingFatherMother mitem,faitem,moitem; int fid, mid; // MemoryStream msFirstPass = new MemoryStream(); SLDocument sl = new SLDocument(fileStream, sheetName); // There is no way that I can see to get the Rows SLWorksheetStatistics stats = sl.GetWorksheetStatistics(); for (int row = 2; row <= stats.NumberOfRows; row++) { person = new Person(); mitem = new(); id = sl.GetCellValueAsInt32(row, (int) enumIdx.Id); mitem.IId = id; person.FirstName = sl.GetCellValueAsString(row, (int) enumIdx.FirstName); person.LastName = sl.GetCellValueAsString(row, (int) enumIdx.LastName); person.Email = sl.GetCellValueAsString(row, (int) enumIdx.Email); person.Phone = sl.GetCellValueAsString(row, (int) enumIdx.Phone); person.Image = sl.GetCellValueAsString(row, (int) enumIdx.Image); person.Alive = sl.GetCellValueAsBoolean(row, (int) enumIdx.Alive); person.dob = sl.GetCellValueAsDateTime(row, (int) enumIdx.Dob); person.Sex = sl.GetCellValueAsString(row, (int) enumIdx.Sex); person.Address = sl.GetCellValueAsString(row, (int) enumIdx.Address); mitem.IFatherId = sl.GetCellValueAsInt32(row, (int) enumIdx.FatherId); mitem.IMotherId = sl.GetCellValueAsInt32(row, (int) enumIdx.MotherId); _context.Persons.Add(person); _context.SaveChanges(); mitem.TId = person.Id; ids.Add(id); updateperson.Add(mitem.IId, mitem); colums = new(); colums.Code = $"{mitem.IId} {mitem.IFatherId} {mitem.IMotherId}"; colums.Description = $"{mitem.TId} {mitem.TFatherId} {mitem.TMotherId}"; output.Add(colums); } for (int i = 0; i < ids.Count; i++) { id = ids[i]; mitem = updateperson[id]; fid = mitem.IFatherId; if (updateperson.ContainsKey(fid)) { faitem = updateperson[fid]; mitem.TFatherId = faitem.TId; } mid = mitem.IMotherId; if (updateperson.ContainsKey(mid)) { moitem = updateperson[mid]; mitem.TMotherId = moitem.TId; } uperson = await _context.Persons.FindAsync(mitem.TId); if (uperson == null) continue; uperson.FatherId = mitem.TFatherId; uperson.MotherId = mitem.TMotherId; if (mitem.TFatherId > 0 && mitem.TMotherId > 0) { keypair = mitem.TFatherId + "," + mitem.TMotherId; if (!relationDic.ContainsKey(keypair)) { iRelation = new(); iRelation.FatherId = mitem.TFatherId; iRelation.MotherId = mitem.TMotherId; relationDic.Add(keypair, iRelation); } } await _context.SaveChangesAsync(); } //finally add relation ship table RelationShip model; foreach (KeyValuePair item in relationDic) { model = new RelationShip(); model.PersonId = item.Value.FatherId; model.RelatePersonId = item.Value.MotherId; _context.RelationShips.Add(model); _context.SaveChanges(); } return output; } }