ql_apimanager_backend/Apimanager_backend/Services/PackageService.cs
2024-11-20 17:54:09 +08:00

202 lines
8.2 KiB
C#

using Apimanager_backend.Data;
using Apimanager_backend.Dtos;
using Apimanager_backend.Exceptions;
using Apimanager_backend.Models;
using AutoMapper;
using AutoMapper.Configuration.Annotations;
using Microsoft.EntityFrameworkCore;
namespace Apimanager_backend.Services
{
public class PackageService : IPackageService
{
private readonly ApiContext apiContext;
private readonly ILogger<PackageService> logger;
private readonly IMapper mapper;
public PackageService(ApiContext apiContext,ILogger<PackageService> logger,IMapper mapper)
{
this.apiContext = apiContext;
this.logger = logger;
this.mapper = mapper;
}
#region
public async Task<PackageInfoDto> AddPackageAsync(AddPackageDto addPackageDto)
{
var packageInfo = mapper.Map<Apipackage>(addPackageDto);
apiContext.Apipackages.Add(packageInfo);
await apiContext.SaveChangesAsync();
return mapper.Map<PackageInfoDto>(packageInfo);
}
#endregion
#region
public async Task<UserPackage> AddUserPackageTimeAsync(int packageId,int userId,TimeSpan time,bool isAdmin)
{
await using var transaction = await apiContext.Database.BeginTransactionAsync();
try
{
//查询用户名下有无对应套餐
var userPackageInfo = await apiContext.UserPackages.FirstOrDefaultAsync(
x => x.PackageId == packageId && x.UserId == userId
);
//查询套餐是否存在
var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId);
if (packageInfo == null)
{
throw new BaseException(4004,"套餐不存在");
}
//查询用户是否存在
var user = await apiContext.Users.FirstOrDefaultAsync(x => x.Id == userId);
if (user == null)
{
throw new BaseException(2004,"用户不存在");
}
//如果没有对应套餐关联则新建
if (userPackageInfo == null)
{
userPackageInfo = new UserPackage
{
PackageId = packageId,
UserId = userId,
ExpiryDate = DateTime.UtcNow + time,
};
apiContext.UserPackages.Add(userPackageInfo);
}
else
{
//否则直接在关联记录上添加有效期
userPackageInfo.ExpiryDate += time;
apiContext.UserPackages.Update(userPackageInfo);
}
if (!isAdmin)
{
//扣除对应用户余额
user.Balance -= packageInfo.Price * time.Days;
apiContext.Users.Update(user);
}
await apiContext.SaveChangesAsync();
await transaction.CommitAsync();
return userPackageInfo;
} catch (Exception)
{
await transaction.RollbackAsync();
throw;
}
}
#endregion
#region
public async Task<UserPackage> DecuteUserPackageTimeAsync(int packageId,int userId, TimeSpan time)
{
await using var transaction = await apiContext.Database.BeginTransactionAsync();
try
{
//查询用户名下有无对应套餐
var userPackageInfo = await apiContext.UserPackages.FirstOrDefaultAsync(
x => x.PackageId == packageId && x.UserId == userId
);
//如果没有对应套餐则返回错误信息
if (userPackageInfo == null)
{
throw new BaseException(4004,"套餐未找到");
}
//否则直接在关联记录上添加有效期
userPackageInfo.ExpiryDate -= time;
apiContext.UserPackages.Update(userPackageInfo);
await apiContext.SaveChangesAsync();
await transaction.CommitAsync();
return userPackageInfo;
}
catch (Exception)
{
await transaction.RollbackAsync();
throw;
}
}
#endregion
#region
public async Task DeletePackageAsync(int packageId)
{
await using var transaction = await apiContext.Database.BeginTransactionAsync();
try
{
var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId);
if (packageInfo == null)
{
throw new BaseException(4004, "套餐未找到");
}
packageInfo.IsDeleted = true;
apiContext.Apipackages.Update(packageInfo);
await apiContext.SaveChangesAsync();
await transaction.CommitAsync();
}catch(Exception)
{
transaction.Rollback();
throw;
}
}
#endregion
#region
public async Task<List<PackageInfoDto>> GetAllPackagesAsync(int pageIndex, int pageSize, bool desc)
{
IQueryable<Apipackage> query = apiContext.Apipackages.Where(x => true).OrderBy(x => x.Id);
if(desc)
{
query = query.OrderDescending();
}
query = query.Skip((pageIndex - 1) * pageSize).Take(pageSize);
var list = await query.ToListAsync();
return mapper.Map<List<PackageInfoDto>>(list);
}
#endregion
#region
public async Task<List<UserPackage>> GetUserPackagesAsync(int userId)
{
var userpackageInfo = await apiContext.UserPackages.Where(x => x.UserId == userId).ToListAsync();
return userpackageInfo;
}
#endregion
#region
public async Task<PackageInfoDto> PackageInfoByIdAsync(int packageId)
{
var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId);
if(packageInfo == null)
{
throw new BaseException(4004,"套餐未找到");
}
return mapper.Map<PackageInfoDto>(packageInfo);
}
#endregion
#region
public async Task<PackageInfoDto> UpdatePackageAsync(int packageId, UpdatePackageDto updatePackageDto)
{
await using var transaction = await apiContext.Database.BeginTransactionAsync();
try
{
//查询对应套餐
var packageInfo = await apiContext.Apipackages.FirstOrDefaultAsync(x => x.Id == packageId);
if (packageInfo == null)
{
throw new BaseException(4004, "Success");
}
//更新字段
packageInfo.Name = updatePackageDto.Name ?? packageInfo.Name;
packageInfo.CallLimit = updatePackageDto.CallLimit != null ? updatePackageDto.CallLimit.Value : packageInfo.CallLimit;
packageInfo.OneMinuteLimit = updatePackageDto.OneMinuteLimit != null ? updatePackageDto.OneMinuteLimit.Value : packageInfo.OneMinuteLimit;
packageInfo.Price = updatePackageDto.Price != null ? updatePackageDto.Price.Value : packageInfo.Price;
//更新
apiContext.Apipackages.Update(packageInfo);
await apiContext.SaveChangesAsync();
await transaction.CommitAsync();
return mapper.Map<PackageInfoDto>(packageInfo);
}
catch (Exception)
{
await transaction.RollbackAsync();
throw;
}
}
#endregion
}
}