practicekea_backend/microservices/S3Bucket/Services/AWSS3FileService.cs

283 lines
10 KiB
C#
Raw Permalink Normal View History

2024-12-02 13:24:34 +00:00
using Amazon.S3.Model;
using Microsoft.AspNetCore.Http;
using OnlineAssessment.Helpers;
using OnlineAssessment.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
namespace OnlineAssessment.Services
{
public interface IAWSS3FileService
{
2025-11-03 05:54:39 +00:00
Task<string> UploadFile(string uploadFileName);
2024-12-02 13:24:34 +00:00
//Task<bool> UploadProfileImage(int institute_id, int user_id, string uploadFileName);
Task<Object> UploadProfileImage(int institute_id, int user_id, IFormFile file);
Task<Object> UploadExamImage(int institute_id, int user_id, int exam_id, IFormFile file);
Task<Object> UploadPracticeImage(int institute_id, int user_id, int practice_id, IFormFile file);
2025-11-03 05:54:39 +00:00
Task<Object> UploadQuestionImage(int institute_id, IFormFile file);
2024-12-02 13:24:34 +00:00
Task<List<FilePathWithMeta>> FilesList();
Task<Stream> GetFile(int institute_id, int user_id, string folder, string key);
2025-11-03 05:54:39 +00:00
Task<string> UpdateFile(UploadFileName uploadFileName, string key);
2024-12-02 13:24:34 +00:00
Task<bool> DeleteFile(string key);
Task<bool> DeleteProfileImage(int institute_id, int user_id);
}
public class AWSS3FileService : IAWSS3FileService
{
private readonly IAWSS3BucketHelper _AWSS3BucketHelper;
public AWSS3FileService(IAWSS3BucketHelper AWSS3BucketHelper)
{
this._AWSS3BucketHelper = AWSS3BucketHelper;
}
2025-11-03 05:54:39 +00:00
public async Task<string> UploadFile(string uploadFileName)
2024-12-02 13:24:34 +00:00
{
try
{
var path = Path.Combine(uploadFileName.ToString());
using (FileStream fsSource = new FileStream(path, FileMode.Open, FileAccess.Read))
{
string fileExtension = Path.GetExtension(path);
string fileName = string.Empty;
fileName = $"{DateTime.Now.Ticks}{fileExtension}";
return await _AWSS3BucketHelper.UploadFile(fsSource, path);
}
}
catch (Exception ex)
{
throw ex;
}
}
/*
public async Task<bool> UploadProfileImage(int institute_id, int user_id, string uploadFileName)
{
try
{
var path = Path.Combine(uploadFileName.ToString());
using (FileStream fsSource = new FileStream(path, FileMode.Open, FileAccess.Read))
{
string fileExtension = Path.GetExtension(path);
string fileName = string.Empty;
string folder = "/user-photo/";
fileName = $"{institute_id.ToString()}{folder}{user_id.ToString()}{fileExtension}";
return await _AWSS3BucketHelper.UploadFile(fsSource, fileName);
}
}
catch (Exception ex)
{
throw ex;
}
}
*/
public async Task<Object> UploadProfileImage(int institute_id, int user_id, IFormFile file)
{
try
{
2025-11-03 05:54:39 +00:00
IList<string> AllowedFileExtensions = new List<string> { ".png", ".jpg", ".jpeg" };
2024-12-02 13:24:34 +00:00
string fileExtension = Path.GetExtension(file.FileName.ToString()).ToLower();
if (!AllowedFileExtensions.Contains(fileExtension))
{
var message = string.Format("Please Upload image of type .png or .jpg");
return message;
}
fileExtension = ".png";
string fileName = string.Empty;
string folder = "/user-photo/";
fileName = $"{institute_id.ToString()}{folder}{user_id.ToString()}{fileExtension}";
return await _AWSS3BucketHelper.UploadFile(file.OpenReadStream(), fileName);
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<Object> UploadExamImage(int institute_id, int user_id, int exam_id, IFormFile file)
{
try
{
2025-11-03 05:54:39 +00:00
IList<string> AllowedFileExtensions = new List<string> { ".png", ".jpg", ".jpeg" };
2024-12-02 13:24:34 +00:00
string fileExtension = Path.GetExtension(file.FileName.ToString()).ToLower();
if (!AllowedFileExtensions.Contains(fileExtension))
{
2025-11-03 05:54:39 +00:00
var message = string.Format("Please Upload image of type .png., jpg, jpeg");
2024-12-02 13:24:34 +00:00
return message;
}
string fileName = string.Empty;
string folder = "/exams/";
2025-11-03 05:54:39 +00:00
fileExtension = ".png";
2024-12-02 13:24:34 +00:00
fileName = $"{institute_id.ToString()}{folder}{exam_id.ToString()}{fileExtension}";
return await _AWSS3BucketHelper.UploadFile(file.OpenReadStream(), fileName);
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<Object> UploadPracticeImage(int institute_id, int user_id, int practice_id, IFormFile file)
{
try
{
2025-11-03 05:54:39 +00:00
IList<string> AllowedFileExtensions = new List<string> { ".png", ".jpg", ".jpeg" };
2024-12-02 13:24:34 +00:00
string fileExtension = Path.GetExtension(file.FileName.ToString()).ToLower();
if (!AllowedFileExtensions.Contains(fileExtension))
{
var message = string.Format("Please Upload image of type .png.");
return message;
}
string fileName = string.Empty;
string folder = "/practices/";
2025-11-03 05:54:39 +00:00
fileExtension = ".png";
2024-12-02 13:24:34 +00:00
fileName = $"{institute_id.ToString()}{folder}{practice_id.ToString()}{fileExtension}";
return await _AWSS3BucketHelper.UploadFile(file.OpenReadStream(), fileName);
}
catch (Exception ex)
{
throw ex;
}
}
2025-11-03 05:54:39 +00:00
public async Task<Object> UploadQuestionImage(int institute_id, IFormFile file)
{
try
{
// Allowed file types
IList<string> AllowedFileExtensions = new List<string> { ".png", ".jpg", ".jpeg" };
string fileExtension = Path.GetExtension(file.FileName).ToLower();
if (!AllowedFileExtensions.Contains(fileExtension))
{
throw new Exception("Please upload an image of type .png, .jpg, or .jpeg");
}
string folder = "/questions/";
fileExtension = ".png";
// Create a unique file name (so older uploads don't get overwritten)
string uniqueFileName = $"{institute_id}/{folder}/{Guid.NewGuid()}{fileExtension}";
// Upload file to S3
return await _AWSS3BucketHelper.UploadFile(file.OpenReadStream(), uniqueFileName);
}
catch (Exception ex)
{
throw new Exception($"Image upload failed: {ex.Message}");
}
}
2024-12-02 13:24:34 +00:00
public async Task<List<FilePathWithMeta>> FilesList()
{
try
{
GetObjectMetadataResponse meta = new GetObjectMetadataResponse();
KeyValue kv = new KeyValue();
List<KeyValue> lkv = new List<KeyValue>();
FilePathWithMeta metaFile = new FilePathWithMeta();
List<FilePathWithMeta> listMetaFile = new List<FilePathWithMeta>();
ListVersionsResponse listVersions = await _AWSS3BucketHelper.FilesList();
List<string> filenamelist = listVersions.Versions.Select(c => c.Key).ToList();
filenamelist = filenamelist.Where(r => r.EndsWith("png")).ToList();
foreach(string name in filenamelist)
{
meta = await _AWSS3BucketHelper.MetaDetail(name);
foreach (string key in meta.Metadata.Keys)
{
kv.key = key;
kv.value = meta.Metadata[key];
lkv.Add(kv);
}
metaFile.file_path = name;
metaFile.listmetadata = lkv;
listMetaFile.Add(metaFile);
}
return listMetaFile;
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<Stream> GetFile(int institute_id, int user_id, string folder, string key)
{
//string fileExtension = ".png";
string fileName = string.Empty;
fileName = $"{institute_id.ToString()}{folder}{key.ToString()}";
try
{
Stream fileStream = await _AWSS3BucketHelper.GetFile(fileName);
if (fileStream == null)
{
Exception ex = new Exception("File Not Found");
throw ex;
}
else
{
return fileStream;
}
}
catch (Exception ex)
{
throw ex;
}
}
2025-11-03 05:54:39 +00:00
public async Task<string> UpdateFile(UploadFileName uploadFileName, string key)
2024-12-02 13:24:34 +00:00
{
try
{
var path = Path.Combine("Files", uploadFileName.ToString() + ".png");
using (FileStream fsSource = new FileStream(path, FileMode.Open, FileAccess.Read))
{
return await _AWSS3BucketHelper.UploadFile(fsSource, key);
}
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<bool> DeleteProfileImage(int institute_id, int user_id)
{
try
{
string fileExtension = ".png";
string fileName = string.Empty;
string folder = "/user-photo/";
fileName = $"{institute_id.ToString()}{folder}{user_id.ToString()}{fileExtension}";
return await _AWSS3BucketHelper.DeleteFile(fileName);
}
catch (Exception ex)
{
throw ex;
}
}
public async Task<bool> DeleteFile(string key)
{
try
{
return await _AWSS3BucketHelper.DeleteFile(key);
}
catch (Exception ex)
{
throw ex;
}
}
}
}