mirror of
https://github.com/bitwarden/server.git
synced 2024-11-22 12:15:36 +01:00
table storage event repo stub
This commit is contained in:
parent
8a81241f13
commit
341ef0a943
14
src/Core/Enums/EventType.cs
Normal file
14
src/Core/Enums/EventType.cs
Normal file
@ -0,0 +1,14 @@
|
||||
namespace Bit.Core.Enums
|
||||
{
|
||||
public enum EventType : int
|
||||
{
|
||||
User_LoggedIn = 1000,
|
||||
User_ChangedPassword = 1001,
|
||||
User_Enabled2fa = 1002,
|
||||
User_Disabled2fa = 1003,
|
||||
|
||||
Cipher_Created = 2000,
|
||||
Cipher_Edited = 2001,
|
||||
Cipher_Deleted = 2002
|
||||
}
|
||||
}
|
158
src/Core/Repositories/TableStorage/EventRepository.cs
Normal file
158
src/Core/Repositories/TableStorage/EventRepository.cs
Normal file
@ -0,0 +1,158 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Bit.Core.Enums;
|
||||
using Bit.Core.Models.Table;
|
||||
using Bit.Core.Utilities;
|
||||
using Microsoft.WindowsAzure.Storage;
|
||||
using Microsoft.WindowsAzure.Storage.Table;
|
||||
|
||||
namespace Bit.Core.Repositories.TableStorage
|
||||
{
|
||||
public class EventRepository
|
||||
{
|
||||
public EventRepository(GlobalSettings globalSettings)
|
||||
{
|
||||
var storageAccount = CloudStorageAccount.Parse(globalSettings.Storage.ConnectionString);
|
||||
var tableClient = storageAccount.CreateCloudTableClient();
|
||||
Table = tableClient.GetTableReference("event");
|
||||
}
|
||||
|
||||
protected CloudTable Table { get; set; }
|
||||
|
||||
public ICollection<EventTableEntiity> GetManyByUser(Guid userId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var start = CoreHelpers.DateTimeToTableStorageKey(startDate);
|
||||
var end = CoreHelpers.DateTimeToTableStorageKey(endDate);
|
||||
|
||||
return Table.CreateQuery<EventTableEntiity>().Where(e =>
|
||||
e.PartitionKey == $"UserId={userId}" &&
|
||||
e.RowKey.CompareTo($"{start}_") >= 0 &&
|
||||
e.RowKey.CompareTo($"{end}`") <= 0).ToList();
|
||||
}
|
||||
|
||||
public ICollection<EventTableEntiity> GetManyByOrganization(Guid organizationId, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var start = CoreHelpers.DateTimeToTableStorageKey(startDate);
|
||||
var end = CoreHelpers.DateTimeToTableStorageKey(endDate);
|
||||
|
||||
return Table.CreateQuery<EventTableEntiity>().Where(e =>
|
||||
e.PartitionKey == $"OrganizationId={organizationId}" &&
|
||||
e.RowKey.CompareTo($"{start}_") >= 0 &&
|
||||
e.RowKey.CompareTo($"{end}`") <= 0).ToList();
|
||||
}
|
||||
|
||||
public async Task CreateAsync(ITableEntity entity)
|
||||
{
|
||||
await Table.ExecuteAsync(TableOperation.Insert(entity));
|
||||
}
|
||||
|
||||
public void CreateManyAsync(IEnumerable<ITableEntity> entities)
|
||||
{
|
||||
if(!entities?.Any() ?? true)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// A batch insert can only contain 100 entities at a time
|
||||
var iterations = entities.Count() / 100;
|
||||
for(var i = 0; i <= iterations; i++)
|
||||
{
|
||||
var batch = new TableBatchOperation();
|
||||
var batchEntities = entities.Skip(i * 100).Take(100);
|
||||
if(!batchEntities.Any())
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
foreach(var entity in batchEntities)
|
||||
{
|
||||
batch.InsertOrReplace(entity);
|
||||
}
|
||||
|
||||
Table.ExecuteBatch(batch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
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; }
|
||||
}
|
||||
}
|
@ -409,5 +409,15 @@ namespace Bit.Core.Utilities
|
||||
.Replace("http://", string.Empty)
|
||||
.Replace("https://", string.Empty);
|
||||
}
|
||||
|
||||
public static string DateTimeToTableStorageKey(DateTime? date = null)
|
||||
{
|
||||
if(date == null)
|
||||
{
|
||||
date = DateTime.UtcNow;
|
||||
}
|
||||
|
||||
return date.Value.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user