1
0
mirror of https://github.com/bitwarden/server synced 2025-12-25 20:53:16 +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,98 @@
using System;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Threading.Tasks;
using Bit.Core.Entities;
using Bit.Core.Repositories;
using Dapper;
namespace Bit.Infrastructure.Dapper.Repositories
{
public abstract class Repository<T, TId> : BaseRepository, IRepository<T, TId>
where TId : IEquatable<TId>
where T : class, ITableObject<TId>
{
public Repository(string connectionString, string readOnlyConnectionString,
string schema = null, string table = null)
: base(connectionString, readOnlyConnectionString)
{
if (!string.IsNullOrWhiteSpace(table))
{
Table = table;
}
if (!string.IsNullOrWhiteSpace(schema))
{
Schema = schema;
}
}
protected string Schema { get; private set; } = "dbo";
protected string Table { get; private set; } = typeof(T).Name;
public virtual async Task<T> GetByIdAsync(TId id)
{
using (var connection = new SqlConnection(ConnectionString))
{
var results = await connection.QueryAsync<T>(
$"[{Schema}].[{Table}_ReadById]",
new { Id = id },
commandType: CommandType.StoredProcedure);
return results.SingleOrDefault();
}
}
public virtual async Task<T> CreateAsync(T obj)
{
obj.SetNewId();
using (var connection = new SqlConnection(ConnectionString))
{
var parameters = new DynamicParameters();
parameters.AddDynamicParams(obj);
parameters.Add("Id", obj.Id, direction: ParameterDirection.InputOutput);
var results = await connection.ExecuteAsync(
$"[{Schema}].[{Table}_Create]",
parameters,
commandType: CommandType.StoredProcedure);
obj.Id = parameters.Get<TId>(nameof(obj.Id));
}
return obj;
}
public virtual async Task ReplaceAsync(T obj)
{
using (var connection = new SqlConnection(ConnectionString))
{
var results = await connection.ExecuteAsync(
$"[{Schema}].[{Table}_Update]",
obj,
commandType: CommandType.StoredProcedure);
}
}
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 connection = new SqlConnection(ConnectionString))
{
await connection.ExecuteAsync(
$"[{Schema}].[{Table}_DeleteById]",
new { Id = obj.Id },
commandType: CommandType.StoredProcedure);
}
}
}
}