erp-platform/api/src/Erp.Platform.Application/Note/NoteAppService.cs

193 lines
6.4 KiB
C#
Raw Normal View History

2025-10-13 14:48:55 +00:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Text.Json;
2025-10-13 21:47:53 +00:00
using System.Threading.Tasks;
2025-11-11 19:49:52 +00:00
using Erp.Platform.BlobStoring;
using Erp.Platform.Entities;
2025-10-13 14:48:55 +00:00
using Microsoft.AspNetCore.Authorization;
2025-10-13 21:47:53 +00:00
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Volo.Abp;
2025-10-13 14:48:55 +00:00
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;
using Volo.Abp.Identity;
2025-10-13 14:48:55 +00:00
namespace Erp.Platform.Notes;
2025-10-13 14:48:55 +00:00
[Authorize]
public class NoteAppService : CrudAppService<
Note,
NoteDto,
2025-10-13 14:48:55 +00:00
Guid,
NoteListRequestDto>
2025-10-13 14:48:55 +00:00
{
private readonly IRepository<IdentityUser, Guid> _repositoryUser;
2025-10-25 23:42:35 +00:00
private readonly BlobManager _blobContainer;
2025-10-13 21:47:53 +00:00
public NoteAppService(
IRepository<Note, Guid> repo,
2025-10-25 23:42:35 +00:00
IRepository<IdentityUser, Guid> repositoryUser,
BlobManager blobContainer
2025-10-13 21:47:53 +00:00
) : base(repo)
2025-10-13 14:48:55 +00:00
{
_repositoryUser = repositoryUser;
2025-10-25 23:42:35 +00:00
_blobContainer = blobContainer;
2025-10-13 21:47:53 +00:00
// CreatePolicyName = $"{AppCodes.Listforms.Listform}.Create";
// UpdatePolicyName = $"{AppCodes.Listforms.Listform}.Update";
// DeletePolicyName = $"{AppCodes.Listforms.Listform}.Delete";
2025-10-13 14:48:55 +00:00
2025-10-13 21:47:53 +00:00
// bool canAccess = await authManager.CanAccess(listFormCode, AuthorizationTypeEnum.Update);
// if (!canAccess)
// {
// throw new UserFriendlyException(L[AppErrorCodes.NoAuth]);
// }
}
public async Task<NoteFileDto> GetDownloadAsync(string savedFileName)
2025-10-13 21:47:53 +00:00
{
if (string.IsNullOrWhiteSpace(savedFileName))
throw new UserFriendlyException("Dosya adı geçersiz");
var stream = await _blobContainer.GetAsync(BlobContainerNames.Note, savedFileName);
if (stream == null)
throw new UserFriendlyException("Dosya bulunamadı");
var activities = await Repository.GetListAsync();
var fileDto = activities
.SelectMany(a => JsonSerializer.Deserialize<List<NoteFileDto>>(a.FilesJson ?? "[]"))
.FirstOrDefault(f => f.SavedFileName == savedFileName);
using var ms = new MemoryStream();
await stream.CopyToAsync(ms);
var bytes = ms.ToArray();
// Base64 olarak encode ediyoruz
return new NoteFileDto
{
FileName = fileDto?.FileName ?? savedFileName,
FileType = fileDto?.FileType ?? "application/octet-stream",
FileBase64 = Convert.ToBase64String(bytes) // <-- byte[] yerine Base64 string
};
}
public override async Task<PagedResultDto<NoteDto>> GetListAsync(NoteListRequestDto input)
{
// 1⃣ Filtreleme
var query = await Repository.GetQueryableAsync();
if (!string.IsNullOrWhiteSpace(input.EntityName))
query = query.Where(a => a.EntityName == input.EntityName);
if (!string.IsNullOrWhiteSpace(input.EntityId))
query = query.Where(a => a.EntityId == input.EntityId);
// 2⃣ Sıralama (opsiyonel)
if (!string.IsNullOrWhiteSpace(input.Sorting))
query = query.OrderBy(input.Sorting);
else
query = query.OrderByDescending(a => a.CreationTime);
// 3⃣ Paging
var totalCount = await AsyncExecuter.CountAsync(query);
var activities = await AsyncExecuter.ToListAsync(
query.Skip(input.SkipCount).Take(input.MaxResultCount)
);
// 4⃣ Kullanıcı bilgilerini al
var userIds = activities.Select(a => a.CreatorId).Distinct().ToList();
var userQueryable = await _repositoryUser.GetQueryableAsync();
var users = await userQueryable
.Where(u => userIds.Contains(u.Id))
.Select(u => new { u.Id, u.UserName })
.ToListAsync();
// 5⃣ DTO map ve kullanıcı adı ekleme
var noteDtos = activities.Select(a =>
{
var dto = ObjectMapper.Map<Note, NoteDto>(a);
dto.CreateUserName = users.FirstOrDefault(u => u.Id == a.CreatorId)?.UserName ?? "Unknown";
return dto;
}).ToList();
// 6⃣ Sonuç dön
return new PagedResultDto<NoteDto>(totalCount, noteDtos);
}
public override async Task<NoteDto> CreateAsync([FromForm] NoteDto input)
{
var fileDtos = new List<NoteFileDto>();
if (input.Files != null && input.Files.Length > 0)
{
foreach (var file in input.Files)
{
await using var stream = file.GetStream();
var savedFileName = $"{Guid.NewGuid()}_{file.FileName}";
2025-10-25 23:42:35 +00:00
await _blobContainer.SaveAsync(
BlobContainerNames.Note,
savedFileName,
stream,
true
);
// Dosya bilgisini DTO olarak ekle
fileDtos.Add(new NoteFileDto
{
FileName = file.FileName,
FileType = file.ContentType,
FileSize = file.ContentLength ?? 0,
SavedFileName = savedFileName
});
}
}
input.FilesJson = JsonSerializer.Serialize(fileDtos);
var dto = await base.CreateAsync(input);
dto.CreateUserName = CurrentUser.UserName;
return dto;
}
public override async Task DeleteAsync(Guid id)
{
// Önce entity'i alıyoruz
var note = await Repository.GetAsync(id);
// if (!string.IsNullOrEmpty(note.FilesJson))
// {
// try
// {
// // FilesJson içindeki dosya bilgilerini deserialize ediyoruz
// var files = JsonSerializer.Deserialize<List<NoteFileDto>>(note.FilesJson);
// if (files != null)
// {
// foreach (var file in files)
// {
// // Blob storage'dan sil
// await _noteBlobContainer.DeleteAsync(file.SavedFileName, cancellationToken: default);
// }
// }
// }
// catch (Exception ex)
// {
// // Opsiyonel: silme sırasında hata loglayabilirsin
// Logger.LogWarning(ex, "Blob dosyaları silinirken hata oluştu.");
// }
// }
// Sonra veritabanındaki kaydı sil
await base.DeleteAsync(id);
2025-10-13 14:48:55 +00:00
}
}
2025-11-11 19:49:52 +00:00