1
0
mirror of https://github.com/bitwarden/server synced 2025-12-25 12:43:14 +00:00

Split out repositories to Infrastructure.Dapper / EntityFramework (#1759)

This commit is contained in:
Oscar Hinton
2022-01-11 10:40:51 +01:00
committed by GitHub
parent e2c6fc81f4
commit e4a10aae27
536 changed files with 1629 additions and 1589 deletions

View File

@@ -0,0 +1,126 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AutoMapper;
using Bit.Core.Entities;
using Bit.Core.Repositories;
using Bit.Infrastructure.EntityFramework.Repositories.Queries;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Bit.Infrastructure.EntityFramework.Repositories
{
public abstract class Repository<T, TEntity, TId> : BaseEntityFrameworkRepository, IRepository<T, TId>
where TId : IEquatable<TId>
where T : class, ITableObject<TId>
where TEntity : class, ITableObject<TId>
{
public Repository(IServiceScopeFactory serviceScopeFactory, IMapper mapper, Func<DatabaseContext, DbSet<TEntity>> getDbSet)
: base(serviceScopeFactory, mapper)
{
GetDbSet = getDbSet;
}
protected Func<DatabaseContext, DbSet<TEntity>> GetDbSet { get; private set; }
public virtual async Task<T> GetByIdAsync(TId id)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
var entity = await GetDbSet(dbContext).FindAsync(id);
return Mapper.Map<T>(entity);
}
}
public virtual async Task<T> CreateAsync(T obj)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
obj.SetNewId();
var entity = Mapper.Map<TEntity>(obj);
await dbContext.AddAsync(entity);
await dbContext.SaveChangesAsync();
obj.Id = entity.Id;
return obj;
}
}
public virtual async Task ReplaceAsync(T obj)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
var entity = await GetDbSet(dbContext).FindAsync(obj.Id);
if (entity != null)
{
var mappedEntity = Mapper.Map<TEntity>(obj);
dbContext.Entry(entity).CurrentValues.SetValues(mappedEntity);
await dbContext.SaveChangesAsync();
}
}
}
public virtual async Task UpsertAsync(T obj)
{
if (obj.Id.Equals(default(TId)))
{
await CreateAsync(obj);
}
else
{
await ReplaceAsync(obj);
}
}
public virtual async Task DeleteAsync(T obj)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
var entity = Mapper.Map<TEntity>(obj);
dbContext.Remove(entity);
await dbContext.SaveChangesAsync();
}
}
public virtual async Task RefreshDb()
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var context = GetDatabaseContext(scope);
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
}
}
public virtual async Task<List<T>> CreateMany(List<T> objs)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var entities = new List<TEntity>();
foreach (var o in objs)
{
o.SetNewId();
var entity = Mapper.Map<TEntity>(o);
entities.Add(entity);
}
var dbContext = GetDatabaseContext(scope);
await GetDbSet(dbContext).AddRangeAsync(entities);
await dbContext.SaveChangesAsync();
return objs;
}
}
public IQueryable<Tout> Run<Tout>(IQuery<Tout> query)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
return query.Run(dbContext);
}
}
}
}