Added persigned Urls in Expesne Details API
This commit is contained in:
parent
4a762e4983
commit
0095cd54f6
11
Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs
Normal file
11
Marco.Pms.Model/MongoDBModels/DocumentMongoDB.cs
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
namespace Marco.Pms.Model.MongoDBModels
|
||||||
|
{
|
||||||
|
public class DocumentMongoDB
|
||||||
|
{
|
||||||
|
public string DocumentId { get; set; } = string.Empty;
|
||||||
|
public string FileName { get; set; } = string.Empty;
|
||||||
|
public string ContentType { get; set; } = string.Empty;
|
||||||
|
public string S3Key { get; set; } = string.Empty;
|
||||||
|
public string ThumbS3Key { get; set; } = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
@ -18,8 +18,7 @@
|
|||||||
public string? TransactionId { get; set; }
|
public string? TransactionId { get; set; }
|
||||||
public string Description { get; set; } = string.Empty;
|
public string Description { get; set; } = string.Empty;
|
||||||
public string? Location { get; set; }
|
public string? Location { get; set; }
|
||||||
public List<string> S3Key { get; set; } = new List<string>();
|
public List<DocumentMongoDB> Documents { get; set; } = new List<DocumentMongoDB>();
|
||||||
public List<string>? ThumbS3Key { get; set; }
|
|
||||||
public string? GSTNumber { get; set; }
|
public string? GSTNumber { get; set; }
|
||||||
public int? NoOfPersons { get; set; }
|
public int? NoOfPersons { get; set; }
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
|
@ -11,4 +11,12 @@
|
|||||||
public string ContentType { get; set; } = string.Empty;
|
public string ContentType { get; set; } = string.Empty;
|
||||||
public DateTime UploadedAt { get; set; }
|
public DateTime UploadedAt { get; set; }
|
||||||
}
|
}
|
||||||
|
public class BasicDocumentVM
|
||||||
|
{
|
||||||
|
public Guid DocumentId { get; set; }
|
||||||
|
public string FileName { get; set; } = string.Empty;
|
||||||
|
public string ContentType { get; set; } = string.Empty;
|
||||||
|
public string? PreSignedUrl { get; set; }
|
||||||
|
public string? ThumbPreSignedUrl { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using Marco.Pms.Model.ViewModels.Activities;
|
using Marco.Pms.Model.ViewModels.Activities;
|
||||||
|
using Marco.Pms.Model.ViewModels.DocumentManager;
|
||||||
using Marco.Pms.Model.ViewModels.Master;
|
using Marco.Pms.Model.ViewModels.Master;
|
||||||
using Marco.Pms.Model.ViewModels.Projects;
|
using Marco.Pms.Model.ViewModels.Projects;
|
||||||
|
|
||||||
@ -22,8 +23,7 @@ namespace Marco.Pms.Model.ViewModels.Expenses
|
|||||||
public string? TransactionId { get; set; }
|
public string? TransactionId { get; set; }
|
||||||
public string Description { get; set; } = string.Empty;
|
public string Description { get; set; } = string.Empty;
|
||||||
public string? Location { get; set; }
|
public string? Location { get; set; }
|
||||||
public List<string> S3Key { get; set; } = new List<string>();
|
public List<BasicDocumentVM> Documents { get; set; } = new List<BasicDocumentVM>();
|
||||||
public List<string>? ThumbS3Key { get; set; }
|
|
||||||
public string? GSTNumber { get; set; }
|
public string? GSTNumber { get; set; }
|
||||||
public int? NoOfPersons { get; set; }
|
public int? NoOfPersons { get; set; }
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
|
@ -74,7 +74,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
foreach (var attendanceLog in lstAttendance)
|
foreach (var attendanceLog in lstAttendance)
|
||||||
{
|
{
|
||||||
string objectKey = attendanceLog.Document != null ? attendanceLog.Document.S3Key : string.Empty;
|
string objectKey = attendanceLog.Document != null ? attendanceLog.Document.S3Key : string.Empty;
|
||||||
string preSignedUrl = string.IsNullOrEmpty(objectKey) ? string.Empty : _s3Service.GeneratePreSignedUrlAsync(objectKey);
|
string preSignedUrl = string.IsNullOrEmpty(objectKey) ? string.Empty : _s3Service.GeneratePreSignedUrl(objectKey);
|
||||||
attendanceLogVMs.Add(attendanceLog.ToAttendanceLogVMFromAttendanceLog(preSignedUrl, preSignedUrl));
|
attendanceLogVMs.Add(attendanceLog.ToAttendanceLogVMFromAttendanceLog(preSignedUrl, preSignedUrl));
|
||||||
}
|
}
|
||||||
_logger.LogInfo("{count} Attendance records fetched successfully", lstAttendance.Count);
|
_logger.LogInfo("{count} Attendance records fetched successfully", lstAttendance.Count);
|
||||||
@ -708,7 +708,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
var objectKey = $"tenant-{tenantId}/Employee/{recordAttendanceDot.EmployeeID}/Attendance/{fileName}";
|
var objectKey = $"tenant-{tenantId}/Employee/{recordAttendanceDot.EmployeeID}/Attendance/{fileName}";
|
||||||
|
|
||||||
await _s3Service.UploadFileAsync(base64, fileType, objectKey);
|
await _s3Service.UploadFileAsync(base64, fileType, objectKey);
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(objectKey);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey);
|
||||||
|
|
||||||
document = new Document
|
document = new Document
|
||||||
{
|
{
|
||||||
|
@ -129,7 +129,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
||||||
}
|
}
|
||||||
@ -301,7 +301,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
if (attachment.CommentId == null)
|
if (attachment.CommentId == null)
|
||||||
{
|
{
|
||||||
@ -418,7 +418,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
||||||
}
|
}
|
||||||
@ -532,7 +532,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
attachmentVMs.Add(attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl));
|
||||||
}
|
}
|
||||||
@ -606,7 +606,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
_context.TicketAttachments.Add(attachment);
|
_context.TicketAttachments.Add(attachment);
|
||||||
await _context.SaveChangesAsync();
|
await _context.SaveChangesAsync();
|
||||||
|
|
||||||
string preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
string preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
|
|
||||||
TicketAttachmentVM attachmentVM = attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl);
|
TicketAttachmentVM attachmentVM = attachment.ToTicketAttachmentVMFromTicketAttachment(preSignedUrl, preSignedUrl);
|
||||||
ticketAttachmentVMs.Add(attachmentVM);
|
ticketAttachmentVMs.Add(attachmentVM);
|
||||||
@ -671,7 +671,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
if (attachment.CommentId == null)
|
if (attachment.CommentId == null)
|
||||||
{
|
{
|
||||||
@ -749,7 +749,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
if (attachment.CommentId == null)
|
if (attachment.CommentId == null)
|
||||||
{
|
{
|
||||||
@ -851,7 +851,7 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
string preSignedUrl = string.Empty;
|
string preSignedUrl = string.Empty;
|
||||||
if (document != null)
|
if (document != null)
|
||||||
{
|
{
|
||||||
preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(document.S3Key);
|
preSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
}
|
}
|
||||||
if (attachment.CommentId == null)
|
if (attachment.CommentId == null)
|
||||||
{
|
{
|
||||||
|
@ -220,8 +220,8 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
Documents = d.Documents?.Select(x => new
|
Documents = d.Documents?.Select(x => new
|
||||||
{
|
{
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null),
|
thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrl(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null),
|
||||||
Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null,
|
Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null,
|
||||||
UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(),
|
UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(),
|
||||||
UploadedAt = x.UploadedAt,
|
UploadedAt = x.UploadedAt,
|
||||||
}).ToList(),
|
}).ToList(),
|
||||||
@ -334,8 +334,8 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
Documents = documents?.Select(x => new
|
Documents = documents?.Select(x => new
|
||||||
{
|
{
|
||||||
Id = x.Id,
|
Id = x.Id,
|
||||||
thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null),
|
thumbnailUrl = x.ThumbS3Key != null ? _s3Service.GeneratePreSignedUrl(x.ThumbS3Key) : (x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null),
|
||||||
Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrlAsync(x.S3Key) : null,
|
Url = x.S3Key != null ? _s3Service.GeneratePreSignedUrl(x.S3Key) : null,
|
||||||
UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(),
|
UploadedBy = x.UploadedBy?.ToBasicEmployeeVMFromEmployee() ?? uploadedBy?.ToBasicEmployeeVMFromEmployee(),
|
||||||
UploadedAt = x.UploadedAt,
|
UploadedAt = x.UploadedAt,
|
||||||
}).ToList(),
|
}).ToList(),
|
||||||
@ -382,11 +382,11 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
|
|
||||||
// Step 4: Generate pre-signed URLs for thumbnail and full image (if keys exist)
|
// Step 4: Generate pre-signed URLs for thumbnail and full image (if keys exist)
|
||||||
string? thumbnailUrl = document.ThumbS3Key != null
|
string? thumbnailUrl = document.ThumbS3Key != null
|
||||||
? _s3Service.GeneratePreSignedUrlAsync(document.ThumbS3Key)
|
? _s3Service.GeneratePreSignedUrl(document.ThumbS3Key)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
string? imageUrl = document.S3Key != null
|
string? imageUrl = document.S3Key != null
|
||||||
? _s3Service.GeneratePreSignedUrlAsync(document.S3Key)
|
? _s3Service.GeneratePreSignedUrl(document.S3Key)
|
||||||
: null;
|
: null;
|
||||||
|
|
||||||
// Step 5: Prepare the response object
|
// Step 5: Prepare the response object
|
||||||
|
@ -499,7 +499,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
response.ReportedPreSignedUrls = taskDocs
|
response.ReportedPreSignedUrls = taskDocs
|
||||||
.Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key))
|
.Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
// Add team members
|
// Add team members
|
||||||
@ -532,7 +532,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
|
|
||||||
var commentVm = comment.ToCommentVMFromTaskComment();
|
var commentVm = comment.ToCommentVMFromTaskComment();
|
||||||
commentVm.PreSignedUrls = commentDocs
|
commentVm.PreSignedUrls = commentDocs
|
||||||
.Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key))
|
.Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
commentVMs.Add(commentVm);
|
commentVMs.Add(commentVm);
|
||||||
@ -649,7 +649,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
taskVM.PreSignedUrls = taskDocuments
|
taskVM.PreSignedUrls = taskDocuments
|
||||||
.Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key))
|
.Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
// Construct CommentVM list with document URLs
|
// Construct CommentVM list with document URLs
|
||||||
@ -667,7 +667,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
|
|
||||||
var commentVM = comment.ToCommentVMFromTaskComment();
|
var commentVM = comment.ToCommentVMFromTaskComment();
|
||||||
commentVM.PreSignedUrls = commentDocs
|
commentVM.PreSignedUrls = commentDocs
|
||||||
.Select(d => _s3Service.GeneratePreSignedUrlAsync(d.S3Key))
|
.Select(d => _s3Service.GeneratePreSignedUrl(d.S3Key))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
return commentVM;
|
return commentVM;
|
||||||
|
@ -39,7 +39,7 @@ namespace MarcoBMS.Services.Controllers
|
|||||||
// return BadRequest("Base64 data is missing");
|
// return BadRequest("Base64 data is missing");
|
||||||
// var objectKey = await _s3Service.UploadFileAsync(Image.Base64Data, 1, "Forum");
|
// var objectKey = await _s3Service.UploadFileAsync(Image.Base64Data, 1, "Forum");
|
||||||
// //var objectKey = await _s3Service.UploadFileAsync(Image.FileName, Image.ContentType);
|
// //var objectKey = await _s3Service.UploadFileAsync(Image.FileName, Image.ContentType);
|
||||||
// var preSignedUrl = _s3Service.GeneratePreSignedUrlAsync(objectKey);
|
// var preSignedUrl = _s3Service.GeneratePreSignedUrl(objectKey);
|
||||||
|
|
||||||
// return Ok(new
|
// return Ok(new
|
||||||
// {
|
// {
|
||||||
|
@ -4,6 +4,7 @@ using Marco.Pms.Helpers;
|
|||||||
using Marco.Pms.Helpers.CacheHelper;
|
using Marco.Pms.Helpers.CacheHelper;
|
||||||
using Marco.Pms.Model.Expenses;
|
using Marco.Pms.Model.Expenses;
|
||||||
using Marco.Pms.Model.Master;
|
using Marco.Pms.Model.Master;
|
||||||
|
using Marco.Pms.Model.MongoDBModels;
|
||||||
using Marco.Pms.Model.MongoDBModels.Expenses;
|
using Marco.Pms.Model.MongoDBModels.Expenses;
|
||||||
using Marco.Pms.Model.MongoDBModels.Masters;
|
using Marco.Pms.Model.MongoDBModels.Masters;
|
||||||
using Marco.Pms.Model.MongoDBModels.Project;
|
using Marco.Pms.Model.MongoDBModels.Project;
|
||||||
@ -872,21 +873,26 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var billAttachments = await _context.BillAttachments
|
var billAttachment = await _context.BillAttachments
|
||||||
.Include(ba => ba.Document)
|
.Include(ba => ba.Document)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(ba => ba.ExpensesId == expense.Id && ba.Document != null)
|
.Where(ba => ba.ExpensesId == expense.Id && ba.Document != null)
|
||||||
.GroupBy(ba => ba.ExpensesId)
|
.GroupBy(ba => ba.ExpensesId)
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(),
|
Documents = g.Select(ba => new DocumentMongoDB
|
||||||
ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList()
|
{
|
||||||
|
DocumentId = ba.Document!.Id.ToString(),
|
||||||
|
FileName = ba.Document.FileName,
|
||||||
|
ContentType = ba.Document.ContentType,
|
||||||
|
S3Key = ba.Document.S3Key,
|
||||||
|
ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key
|
||||||
|
}).ToList()
|
||||||
})
|
})
|
||||||
.FirstOrDefaultAsync(); ;
|
.FirstOrDefaultAsync(); ;
|
||||||
if (billAttachments != null)
|
if (billAttachment != null)
|
||||||
{
|
{
|
||||||
expenseCache.S3Key = billAttachments.S3Keys;
|
expenseCache.Documents = billAttachment.Documents;
|
||||||
expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -922,14 +928,19 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
.GroupBy(ba => ba.ExpensesId)
|
.GroupBy(ba => ba.ExpensesId)
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(),
|
Documents = g.Select(ba => new DocumentMongoDB
|
||||||
ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList()
|
{
|
||||||
|
DocumentId = ba.Document!.Id.ToString(),
|
||||||
|
FileName = ba.Document.FileName,
|
||||||
|
ContentType = ba.Document.ContentType,
|
||||||
|
S3Key = ba.Document.S3Key,
|
||||||
|
ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key
|
||||||
|
}).ToList()
|
||||||
})
|
})
|
||||||
.FirstOrDefaultAsync();
|
.FirstOrDefaultAsync();
|
||||||
if (billAttachments != null)
|
if (billAttachments != null)
|
||||||
{
|
{
|
||||||
expenseCache.S3Key = billAttachments.S3Keys;
|
expenseCache.Documents = billAttachments.Documents;
|
||||||
expenseCache.ThumbS3Key = billAttachments.ThumbS3Keys;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@ -965,14 +976,19 @@ namespace Marco.Pms.Services.Helpers
|
|||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
ExpensesId = g.Key,
|
ExpensesId = g.Key,
|
||||||
S3Keys = g.Select(ba => ba.Document!.S3Key).ToList(),
|
Documents = g.Select(ba => new DocumentMongoDB
|
||||||
ThumbS3Keys = g.Select(ba => ba.Document!.ThumbS3Key ?? ba.Document.S3Key).ToList()
|
{
|
||||||
|
DocumentId = ba.Document!.Id.ToString(),
|
||||||
|
FileName = ba.Document.FileName,
|
||||||
|
ContentType = ba.Document.ContentType,
|
||||||
|
S3Key = ba.Document.S3Key,
|
||||||
|
ThumbS3Key = ba.Document.ThumbS3Key ?? ba.Document.S3Key
|
||||||
|
}).ToList()
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
foreach (var expenseCache in expensesCache)
|
foreach (var expenseCache in expensesCache)
|
||||||
{
|
{
|
||||||
expenseCache.S3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.S3Keys).FirstOrDefault() ?? new List<string>();
|
expenseCache.Documents = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.Documents).FirstOrDefault() ?? new List<DocumentMongoDB>();
|
||||||
expenseCache.ThumbS3Key = billAttachments.Where(ba => ba.ExpensesId == Guid.Parse(expenseCache.Id)).Select(ba => ba.ThumbS3Keys).FirstOrDefault();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
@ -5,12 +5,14 @@ using Marco.Pms.Model.Dtos.Project;
|
|||||||
using Marco.Pms.Model.Employees;
|
using Marco.Pms.Model.Employees;
|
||||||
using Marco.Pms.Model.Expenses;
|
using Marco.Pms.Model.Expenses;
|
||||||
using Marco.Pms.Model.Master;
|
using Marco.Pms.Model.Master;
|
||||||
|
using Marco.Pms.Model.MongoDBModels;
|
||||||
using Marco.Pms.Model.MongoDBModels.Employees;
|
using Marco.Pms.Model.MongoDBModels.Employees;
|
||||||
using Marco.Pms.Model.MongoDBModels.Expenses;
|
using Marco.Pms.Model.MongoDBModels.Expenses;
|
||||||
using Marco.Pms.Model.MongoDBModels.Masters;
|
using Marco.Pms.Model.MongoDBModels.Masters;
|
||||||
using Marco.Pms.Model.MongoDBModels.Project;
|
using Marco.Pms.Model.MongoDBModels.Project;
|
||||||
using Marco.Pms.Model.Projects;
|
using Marco.Pms.Model.Projects;
|
||||||
using Marco.Pms.Model.ViewModels.Activities;
|
using Marco.Pms.Model.ViewModels.Activities;
|
||||||
|
using Marco.Pms.Model.ViewModels.DocumentManager;
|
||||||
using Marco.Pms.Model.ViewModels.Employee;
|
using Marco.Pms.Model.ViewModels.Employee;
|
||||||
using Marco.Pms.Model.ViewModels.Expanses;
|
using Marco.Pms.Model.ViewModels.Expanses;
|
||||||
using Marco.Pms.Model.ViewModels.Expenses;
|
using Marco.Pms.Model.ViewModels.Expenses;
|
||||||
@ -234,6 +236,15 @@ namespace Marco.Pms.Services.MappingProfiles
|
|||||||
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region ======================================================= Document =======================================================
|
||||||
|
|
||||||
|
CreateMap<DocumentMongoDB, BasicDocumentVM>()
|
||||||
|
.ForMember(
|
||||||
|
dest => dest.DocumentId,
|
||||||
|
opt => opt.MapFrom(src => Guid.Parse(src.DocumentId)));
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -184,7 +184,7 @@ namespace Marco.Pms.Services.Service
|
|||||||
}
|
}
|
||||||
|
|
||||||
expenseVM = await GetAllExpnesRelatedTables(expensesList);
|
expenseVM = await GetAllExpnesRelatedTables(expensesList);
|
||||||
|
totalPages = (int)Math.Ceiling((double)totalEntites / pageSize);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -246,8 +246,13 @@ namespace Marco.Pms.Services.Service
|
|||||||
if (expenseDetails == null)
|
if (expenseDetails == null)
|
||||||
{
|
{
|
||||||
expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId);
|
expenseDetails = await _cache.AddExpenseByIdAsync(id, tenantId);
|
||||||
|
if (expenseDetails == null)
|
||||||
|
{
|
||||||
|
return ApiResponse<object>.ErrorResponse("Expense Not Found", "Expense Not Found", 404);
|
||||||
}
|
}
|
||||||
var vm = GetAllExpnesRelatedTablesFromMongoDB([expenseDetails]);
|
}
|
||||||
|
var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails);
|
||||||
|
|
||||||
return ApiResponse<object>.SuccessResponse(vm, "Successfully fetched the details of expense", 200);
|
return ApiResponse<object>.SuccessResponse(vm, "Successfully fetched the details of expense", 200);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -826,40 +831,32 @@ namespace Marco.Pms.Services.Service
|
|||||||
|
|
||||||
return expenseList;
|
return expenseList;
|
||||||
}
|
}
|
||||||
private async Task<List<ExpenseDetailsVM>> GetAllExpnesRelatedTablesFromMongoDB(List<ExpenseDetailsMongoDB> model)
|
private async Task<ExpenseDetailsVM> GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model)
|
||||||
{
|
{
|
||||||
List<ExpenseDetailsVM> expenseList = new List<ExpenseDetailsVM>();
|
|
||||||
var projectIds = model.Select(m => Guid.Parse(m.ProjectId)).ToList();
|
|
||||||
var statusIds = model.Select(m => Guid.Parse(m.StatusId)).ToList();
|
|
||||||
var expensesTypeIds = model.Select(m => Guid.Parse(m.ExpensesTypeId)).ToList();
|
|
||||||
var paymentModeIds = model.Select(m => Guid.Parse(m.PaymentModeId)).ToList();
|
|
||||||
var createdByIds = model.Select(m => Guid.Parse(m.CreatedById)).ToList();
|
|
||||||
var paidByIds = model.Select(m => Guid.Parse(m.PaidById)).ToList();
|
|
||||||
|
|
||||||
var projectTask = Task.Run(async () =>
|
var projectTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync();
|
return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId));
|
||||||
});
|
});
|
||||||
var paidByTask = Task.Run(async () =>
|
var paidByTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync();
|
return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById));
|
||||||
});
|
});
|
||||||
var createdByTask = Task.Run(async () =>
|
var createdByTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync();
|
return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById));
|
||||||
});
|
});
|
||||||
var expenseTypeTask = Task.Run(async () =>
|
var expenseTypeTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync();
|
return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId));
|
||||||
});
|
});
|
||||||
var paymentModeTask = Task.Run(async () =>
|
var paymentModeTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
await using var dbContext = await _dbContextFactory.CreateDbContextAsync();
|
||||||
return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync();
|
return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId));
|
||||||
});
|
});
|
||||||
var statusMappingTask = Task.Run(async () =>
|
var statusMappingTask = Task.Run(async () =>
|
||||||
{
|
{
|
||||||
@ -868,44 +865,50 @@ namespace Marco.Pms.Services.Service
|
|||||||
.Include(s => s.Status)
|
.Include(s => s.Status)
|
||||||
.Include(s => s.NextStatus)
|
.Include(s => s.NextStatus)
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(es => statusIds.Contains(es.StatusId) && es.Status != null)
|
.Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null)
|
||||||
.GroupBy(s => s.StatusId)
|
.GroupBy(s => s.StatusId)
|
||||||
.Select(g => new
|
.Select(g => new
|
||||||
{
|
{
|
||||||
StatusId = g.Key,
|
|
||||||
Status = g.Select(s => s.Status).FirstOrDefault(),
|
Status = g.Select(s => s.Status).FirstOrDefault(),
|
||||||
NextStatus = g.Select(s => s.NextStatus).ToList()
|
NextStatus = g.Select(s => s.NextStatus).ToList()
|
||||||
}).ToListAsync();
|
}).FirstOrDefaultAsync();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Await all prerequisite checks at once.
|
// Await all prerequisite checks at once.
|
||||||
await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask);
|
await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask);
|
||||||
|
|
||||||
var projects = await projectTask;
|
var project = await projectTask;
|
||||||
var expenseTypes = await expenseTypeTask;
|
var expenseType = await expenseTypeTask;
|
||||||
var paymentModes = await paymentModeTask;
|
var paymentMode = await paymentModeTask;
|
||||||
var statusMappings = await statusMappingTask;
|
var statusMapping = await statusMappingTask;
|
||||||
var paidBys = await paidByTask;
|
var paidBy = await paidByTask;
|
||||||
var createdBys = await createdByTask;
|
var createdBy = await createdByTask;
|
||||||
|
|
||||||
expenseList = model.Select(m =>
|
var response = _mapper.Map<ExpenseDetailsVM>(model);
|
||||||
|
|
||||||
|
response.Project = _mapper.Map<ProjectInfoVM>(project);
|
||||||
|
response.PaidBy = _mapper.Map<BasicEmployeeVM>(paidBy);
|
||||||
|
response.CreatedBy = _mapper.Map<BasicEmployeeVM>(createdBy);
|
||||||
|
response.PaymentMode = _mapper.Map<PaymentModeMatserVM>(paymentMode);
|
||||||
|
response.ExpensesType = _mapper.Map<ExpensesTypeMasterVM>(expenseType);
|
||||||
|
if (statusMapping != null)
|
||||||
{
|
{
|
||||||
var response = _mapper.Map<ExpenseDetailsVM>(m);
|
response.Status = _mapper.Map<ExpensesStatusMasterVM>(statusMapping.Status);
|
||||||
|
response.NextStatus = _mapper.Map<List<ExpensesStatusMasterVM>>(statusMapping.NextStatus);
|
||||||
|
}
|
||||||
|
|
||||||
response.Project = projects.Where(p => p.Id == Guid.Parse(m.ProjectId)).Select(p => _mapper.Map<ProjectInfoVM>(p)).FirstOrDefault();
|
foreach (var document in model.Documents)
|
||||||
response.PaidBy = paidBys.Where(p => p.Id == Guid.Parse(m.PaidById)).Select(p => _mapper.Map<BasicEmployeeVM>(p)).FirstOrDefault();
|
{
|
||||||
response.CreatedBy = createdBys.Where(e => e.Id == Guid.Parse(m.CreatedById)).Select(e => _mapper.Map<BasicEmployeeVM>(e)).FirstOrDefault();
|
var vm = response.Documents.FirstOrDefault(d => d.DocumentId == Guid.Parse(document.DocumentId));
|
||||||
response.Status = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map<ExpensesStatusMasterVM>(s.Status)).FirstOrDefault();
|
|
||||||
response.NextStatus = statusMappings.Where(s => s.StatusId == Guid.Parse(m.StatusId)).Select(s => _mapper.Map<List<ExpensesStatusMasterVM>>(s.NextStatus)).FirstOrDefault();
|
vm!.PreSignedUrl = _s3Service.GeneratePreSignedUrl(document.S3Key);
|
||||||
response.PaymentMode = paymentModes.Where(pm => pm.Id == Guid.Parse(m.PaymentModeId)).Select(pm => _mapper.Map<PaymentModeMatserVM>(pm)).FirstOrDefault();
|
vm!.ThumbPreSignedUrl = _s3Service.GeneratePreSignedUrl(document.ThumbS3Key);
|
||||||
response.ExpensesType = expenseTypes.Where(et => et.Id == Guid.Parse(m.ExpensesTypeId)).Select(et => _mapper.Map<ExpensesTypeMasterVM>(et)).FirstOrDefault();
|
}
|
||||||
|
|
||||||
return response;
|
return response;
|
||||||
}).ToList();
|
|
||||||
|
|
||||||
return expenseList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string).
|
/// Deserializes the filter string, handling multiple potential formats (e.g., direct JSON vs. escaped JSON string).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -71,8 +71,9 @@ namespace Marco.Pms.Services.Service
|
|||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
public string GeneratePreSignedUrlAsync(string objectKey)
|
public string GeneratePreSignedUrl(string objectKey)
|
||||||
{
|
{
|
||||||
|
|
||||||
int expiresInMinutes = 10;
|
int expiresInMinutes = 10;
|
||||||
var request = new GetPreSignedUrlRequest
|
var request = new GetPreSignedUrlRequest
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user