1
0
mirror of https://github.com/bitwarden/server.git synced 2024-12-23 17:07:42 +01:00

organize event models. stub out event services

This commit is contained in:
Kyle Spearrin 2017-12-01 09:22:04 -05:00
parent ba9cca057e
commit f4586002c4
14 changed files with 194 additions and 91 deletions

View File

@ -58,7 +58,7 @@ namespace Bit.Api
StripeConfiguration.SetApiKey(globalSettings.StripeApiKey);
// Repositories
services.AddSqlServerRepositories();
services.AddSqlServerRepositories(globalSettings);
// Context
services.AddScoped<CurrentContext>();

View File

@ -36,7 +36,7 @@ namespace Bit.Billing
StripeConfiguration.SetApiKey(globalSettings.StripeApiKey);
// Repositories
services.AddSqlServerRepositories();
services.AddSqlServerRepositories(globalSettings);
// Context
services.AddScoped<CurrentContext>();

View File

@ -0,0 +1,29 @@
using Bit.Core.Enums;
using Bit.Core.Models.Table;
using Bit.Core.Utilities;
namespace Bit.Core.Models.Data
{
public class CipherEvent : EventTableEntity
{
public CipherEvent(Cipher cipher, EventType type)
{
if(cipher.OrganizationId.HasValue)
{
PartitionKey = $"OrganizationId={cipher.OrganizationId.Value}";
}
else
{
PartitionKey = $"UserId={cipher.UserId.Value}";
}
RowKey = string.Format("Date={0}__CipherId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), cipher.Id, type);
OrganizationId = cipher.OrganizationId;
UserId = cipher.UserId;
CipherId = cipher.Id;
Type = type;
}
}
}

View File

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using Bit.Core.Enums;
using Microsoft.WindowsAzure.Storage.Table;
namespace Bit.Core.Models.Data
{
public class EventTableEntity : TableEntity
{
public EventType Type { get; set; }
public Guid? UserId { get; set; }
public Guid? OrganizationId { get; set; }
public Guid? CipherId { get; set; }
public ICollection<Guid> CipherIds { get; set; }
}
}

View File

@ -0,0 +1,30 @@
using System;
using Bit.Core.Enums;
using Bit.Core.Utilities;
namespace Bit.Core.Models.Data
{
public class OrganizationEvent : EventTableEntity
{
public OrganizationEvent(Guid organizationId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__Type={1}",
CoreHelpers.DateTimeToTableStorageKey(), type);
OrganizationId = organizationId;
Type = type;
}
public OrganizationEvent(Guid organizationId, Guid userId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__UserId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), userId, type);
OrganizationId = organizationId;
UserId = userId;
Type = type;
}
}
}

View File

@ -0,0 +1,30 @@
using System;
using Bit.Core.Enums;
using Bit.Core.Utilities;
namespace Bit.Core.Models.Data
{
public class UserEvent : EventTableEntity
{
public UserEvent(Guid userId, EventType type)
{
PartitionKey = $"UserId={userId}";
RowKey = string.Format("Date={0}__Type={1}",
CoreHelpers.DateTimeToTableStorageKey(), type);
UserId = userId;
Type = type;
}
public UserEvent(Guid userId, Guid organizationId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__UserId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), userId, type);
OrganizationId = organizationId;
UserId = userId;
Type = type;
}
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Bit.Core.Models.Data;
using Microsoft.WindowsAzure.Storage.Table;
namespace Bit.Core.Repositories
{
public interface IEventRepository
{
Task<ICollection<EventTableEntity>> GetManyByUserAsync(Guid userId, DateTime startDate, DateTime endDate);
Task CreateAsync(ITableEntity entity);
Task CreateManyAsync(IEnumerable<ITableEntity> entities);
}
}

View File

@ -2,15 +2,14 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Bit.Core.Enums;
using Bit.Core.Models.Table;
using Bit.Core.Models.Data;
using Bit.Core.Utilities;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Table;
namespace Bit.Core.Repositories.TableStorage
{
public class EventRepository
public class EventRepository : IEventRepository
{
public EventRepository(GlobalSettings globalSettings)
{
@ -21,7 +20,7 @@ namespace Bit.Core.Repositories.TableStorage
protected CloudTable Table { get; set; }
public async Task<ICollection<EventTableEntiity>> GetManyByUserAsync(Guid userId,
public async Task<ICollection<EventTableEntity>> GetManyByUserAsync(Guid userId,
DateTime startDate, DateTime endDate)
{
var start = CoreHelpers.DateTimeToTableStorageKey(startDate);
@ -37,8 +36,8 @@ namespace Bit.Core.Repositories.TableStorage
TableOperators.And,
rowFilter);
var query = new TableQuery<EventTableEntiity>().Where(filter);
var results = new List<EventTableEntiity>();
var query = new TableQuery<EventTableEntity>().Where(filter);
var results = new List<EventTableEntity>();
TableContinuationToken continuationToken = null;
do
{
@ -82,84 +81,4 @@ namespace Bit.Core.Repositories.TableStorage
}
}
}
public class UserEvent : EventTableEntiity
{
public UserEvent(Guid userId, EventType type)
{
PartitionKey = $"UserId={userId}";
RowKey = string.Format("Date={0}__Type={1}",
CoreHelpers.DateTimeToTableStorageKey(), type);
UserId = userId;
Type = type;
}
public UserEvent(Guid userId, Guid organizationId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__UserId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), userId, type);
OrganizationId = organizationId;
UserId = userId;
Type = type;
}
}
public class CipherEvent : EventTableEntiity
{
public CipherEvent(Cipher cipher, EventType type)
{
if(cipher.OrganizationId.HasValue)
{
PartitionKey = $"OrganizationId={cipher.OrganizationId.Value}";
}
else
{
PartitionKey = $"UserId={cipher.UserId.Value}";
}
RowKey = string.Format("Date={0}__CipherId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), cipher.Id, type);
OrganizationId = cipher.OrganizationId;
UserId = cipher.UserId;
CipherId = cipher.Id;
Type = type;
}
}
public class OrganizationEvent : EventTableEntiity
{
public OrganizationEvent(Guid organizationId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__Type={1}",
CoreHelpers.DateTimeToTableStorageKey(), type);
OrganizationId = organizationId;
Type = type;
}
public OrganizationEvent(Guid organizationId, Guid userId, EventType type)
{
PartitionKey = $"OrganizationId={organizationId}";
RowKey = string.Format("Date={0}__UserId={1}__Type={2}",
CoreHelpers.DateTimeToTableStorageKey(), userId, type);
OrganizationId = organizationId;
UserId = userId;
Type = type;
}
}
public class EventTableEntiity : TableEntity
{
public EventType Type { get; set; }
public Guid? UserId { get; set; }
public Guid? OrganizationId { get; set; }
public Guid? CipherId { get; set; }
public ICollection<Guid> CipherIds { get; set; }
}
}

View File

@ -0,0 +1,11 @@
using System;
using System.Threading.Tasks;
using Bit.Core.Enums;
namespace Bit.Core.Services
{
public interface IEventService
{
Task LogUserEventAsync(Guid userId, EventType type);
}
}

View File

@ -0,0 +1,28 @@
using System.Threading.Tasks;
using System;
using Bit.Core.Enums;
using Bit.Core.Repositories;
using Bit.Core.Models.Data;
namespace Bit.Core.Services
{
public class EventService : IEventService
{
private readonly IEventRepository _eventRepository;
private readonly GlobalSettings _globalSettings;
public EventService(
IEventRepository eventRepository,
GlobalSettings globalSettings)
{
_eventRepository = eventRepository;
_globalSettings = globalSettings;
}
public async Task LogUserEventAsync(Guid userId, EventType type)
{
var userEvent = new UserEvent(userId, type);
await _eventRepository.CreateAsync(userEvent);
}
}
}

View File

@ -0,0 +1,14 @@
using System;
using System.Threading.Tasks;
using Bit.Core.Enums;
namespace Bit.Core.Services
{
public class NoopEventService : IEventService
{
public Task LogUserEventAsync(Guid userId, EventType type)
{
return Task.FromResult(0);
}
}
}

View File

@ -20,13 +20,14 @@ using Microsoft.WindowsAzure.Storage;
using System;
using System.IO;
using SqlServerRepos = Bit.Core.Repositories.SqlServer;
using TableStorageRepos = Bit.Core.Repositories.TableStorage;
using System.Threading.Tasks;
namespace Bit.Core.Utilities
{
public static class ServiceCollectionExtensions
{
public static void AddSqlServerRepositories(this IServiceCollection services)
public static void AddSqlServerRepositories(this IServiceCollection services, GlobalSettings globalSettings)
{
services.AddSingleton<IUserRepository, SqlServerRepos.UserRepository>();
services.AddSingleton<ICipherRepository, SqlServerRepos.CipherRepository>();
@ -40,6 +41,15 @@ namespace Bit.Core.Utilities
services.AddSingleton<IGroupRepository, SqlServerRepos.GroupRepository>();
services.AddSingleton<IU2fRepository, SqlServerRepos.U2fRepository>();
services.AddSingleton<IInstallationRepository, SqlServerRepos.InstallationRepository>();
if(globalSettings.SelfHosted)
{
// TODO: Sql server repo
}
else
{
services.AddSingleton<IEventRepository, TableStorageRepos.EventRepository>();
}
}
public static void AddBaseServices(this IServiceCollection services)
@ -50,6 +60,7 @@ namespace Bit.Core.Utilities
services.AddSingleton<IOrganizationService, OrganizationService>();
services.AddSingleton<ICollectionService, CollectionService>();
services.AddSingleton<IGroupService, GroupService>();
services.AddSingleton<Services.IEventService, EventService>();
}
public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings)

View File

@ -39,7 +39,7 @@ namespace Bit.Identity
services.AddCustomDataProtectionServices(Environment, globalSettings);
// Repositories
services.AddSqlServerRepositories();
services.AddSqlServerRepositories(globalSettings);
// Context
services.AddScoped<CurrentContext>();

View File

@ -45,7 +45,7 @@ namespace Bit.Jobs
services.AddCustomDataProtectionServices(Environment, globalSettings);
// Repositories
services.AddSqlServerRepositories();
services.AddSqlServerRepositories(globalSettings);
// Context
services.AddScoped<CurrentContext>();