Skip to content

Commit f844247

Browse files
committed
RE1-T120 Audit log repo changes
1 parent 71ce4bc commit f844247

13 files changed

Lines changed: 395 additions & 7 deletions
Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
namespace Resgrid.Model.Repositories
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
5+
namespace Resgrid.Model.Repositories
26
{
37
/// <summary>
48
/// Interface IAuditLogsRepository
@@ -7,5 +11,16 @@
711
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.AuditLog}" />
812
public interface IAuditLogsRepository: IRepository<AuditLog>
913
{
14+
/// <summary>
15+
/// Gets a date-ranged, optionally type-filtered, paged set of audit logs for a department.
16+
/// </summary>
17+
/// <param name="departmentId">The department identifier.</param>
18+
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
19+
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
20+
/// <param name="logType">Optional LogType filter; when null all types are returned.</param>
21+
/// <param name="page">1-based page number.</param>
22+
/// <param name="pageSize">Page size.</param>
23+
/// <returns>Task&lt;IEnumerable&lt;AuditLog&gt;&gt;.</returns>
24+
Task<IEnumerable<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, int? logType, int page, int pageSize);
1025
}
1126
}
Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
namespace Resgrid.Model.Repositories
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
4+
namespace Resgrid.Model.Repositories
25
{
36
/// <summary>
47
/// Interface IPaymentProviderEventsRepository
@@ -7,5 +10,11 @@
710
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.PaymentProviderEvent}" />
811
public interface IPaymentProviderEventsRepository: IRepository<PaymentProviderEvent>
912
{
13+
/// <summary>
14+
/// Gets all provider events for a payment-provider customer id (e.g. a Stripe customer), newest first.
15+
/// </summary>
16+
/// <param name="customerId">The payment-provider customer identifier.</param>
17+
/// <returns>Task&lt;IEnumerable&lt;PaymentProviderEvent&gt;&gt;.</returns>
18+
Task<IEnumerable<PaymentProviderEvent>> GetByCustomerIdAsync(string customerId);
1019
}
1120
}
Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
namespace Resgrid.Model.Repositories
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
5+
namespace Resgrid.Model.Repositories
26
{
37
/// <summary>
48
/// Interface ISystemAuditsRepository
@@ -7,5 +11,26 @@
711
/// <seealso cref="Resgrid.Model.Repositories.IRepository{Resgrid.Model.SystemAudit}" />
812
public interface ISystemAuditsRepository : IRepository<SystemAudit>
913
{
14+
/// <summary>
15+
/// Gets a date-ranged, paged set of system audits for a user (e.g. a login timeline).
16+
/// </summary>
17+
/// <param name="userId">The user identifier.</param>
18+
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
19+
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
20+
/// <param name="page">1-based page number.</param>
21+
/// <param name="pageSize">Page size.</param>
22+
/// <returns>Task&lt;IEnumerable&lt;SystemAudit&gt;&gt;.</returns>
23+
Task<IEnumerable<SystemAudit>> GetByUserIdPagedAsync(string userId, DateTime startDate, DateTime endDate, int page, int pageSize);
24+
25+
/// <summary>
26+
/// Gets a date-ranged, paged set of system audits for a department.
27+
/// </summary>
28+
/// <param name="departmentId">The department identifier.</param>
29+
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
30+
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
31+
/// <param name="page">1-based page number.</param>
32+
/// <param name="pageSize">Page size.</param>
33+
/// <returns>Task&lt;IEnumerable&lt;SystemAudit&gt;&gt;.</returns>
34+
Task<IEnumerable<SystemAudit>> GetByDepartmentIdPagedAsync(int departmentId, DateTime startDate, DateTime endDate, int page, int pageSize);
1035
}
1136
}

Core/Resgrid.Model/Services/IAuditService.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Threading;
34
using System.Threading.Tasks;
45

@@ -10,5 +11,16 @@ public interface IAuditService
1011
Task<List<AuditLog>> GetAllAuditLogsForDepartmentAsync(int departmentId);
1112
string GetAuditLogTypeString(AuditLogTypes logType);
1213
Task<AuditLog> GetAuditLogByIdAsync(int auditLogId);
14+
15+
/// <summary>
16+
/// Gets a date-ranged, optionally type-filtered, paged set of audit logs for a department.
17+
/// </summary>
18+
/// <param name="departmentId">The department identifier.</param>
19+
/// <param name="startDate">Inclusive lower bound on LoggedOn (UTC).</param>
20+
/// <param name="endDate">Exclusive upper bound on LoggedOn (UTC).</param>
21+
/// <param name="logType">Optional LogType filter; when null all types are returned.</param>
22+
/// <param name="page">1-based page number.</param>
23+
/// <param name="pageSize">Page size.</param>
24+
Task<List<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, AuditLogTypes? logType, int page, int pageSize);
1325
}
1426
}

Core/Resgrid.Services/AuditService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ public async Task<List<AuditLog>> GetAllAuditLogsForDepartmentAsync(int departme
3737
return logs.ToList();
3838
}
3939

40+
public async Task<List<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, AuditLogTypes? logType, int page, int pageSize)
41+
{
42+
var logs = await _auditLogsRepository.GetAuditLogsForDepartmentPagedAsync(departmentId, startDate, endDate, (int?)logType, page, pageSize);
43+
return logs.ToList();
44+
}
45+
4046
public string GetAuditLogTypeString(AuditLogTypes logType)
4147
{
4248
switch (logType)

Repositories/Resgrid.Repositories.DataRepository/AuditLogsRepository.cs

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
using Resgrid.Model;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data.Common;
4+
using System.Threading.Tasks;
5+
using Dapper;
6+
using Resgrid.Framework;
7+
using Resgrid.Model;
28
using Resgrid.Model.Repositories;
39
using Resgrid.Model.Repositories.Connection;
410
using Resgrid.Model.Repositories.Queries;
511
using Resgrid.Repositories.DataRepository.Configs;
12+
using Resgrid.Repositories.DataRepository.Queries.AuditLogs;
613

714
namespace Resgrid.Repositories.DataRepository
815
{
@@ -21,5 +28,59 @@ public AuditLogsRepository(IConnectionProvider connectionProvider, SqlConfigurat
2128
_queryFactory = queryFactory;
2229
_unitOfWork = unitOfWork;
2330
}
31+
32+
public async Task<IEnumerable<AuditLog>> GetAuditLogsForDepartmentPagedAsync(int departmentId, DateTime startDate, DateTime endDate, int? logType, int page, int pageSize)
33+
{
34+
try
35+
{
36+
var selectFunction = new Func<DbConnection, Task<IEnumerable<AuditLog>>>(async x =>
37+
{
38+
var dynamicParameters = new DynamicParametersExtension();
39+
dynamicParameters.Add("DepartmentId", departmentId);
40+
dynamicParameters.Add("StartDate", startDate);
41+
dynamicParameters.Add("EndDate", endDate);
42+
dynamicParameters.Add("Offset", (page - 1) * pageSize);
43+
dynamicParameters.Add("PageSize", pageSize);
44+
45+
string query;
46+
if (logType.HasValue)
47+
{
48+
dynamicParameters.Add("LogType", logType.Value);
49+
query = _queryFactory.GetQuery<SelectAuditLogsForDepartmentByTypePagedQuery>();
50+
}
51+
else
52+
{
53+
query = _queryFactory.GetQuery<SelectAuditLogsForDepartmentPagedQuery>();
54+
}
55+
56+
return await x.QueryAsync<AuditLog>(sql: query,
57+
param: dynamicParameters,
58+
transaction: _unitOfWork.Transaction);
59+
});
60+
61+
DbConnection conn = null;
62+
if (_unitOfWork?.Connection == null)
63+
{
64+
using (conn = _connectionProvider.Create())
65+
{
66+
await conn.OpenAsync();
67+
68+
return await selectFunction(conn);
69+
}
70+
}
71+
else
72+
{
73+
conn = _unitOfWork.CreateOrGetConnection();
74+
75+
return await selectFunction(conn);
76+
}
77+
}
78+
catch (Exception ex)
79+
{
80+
Logging.LogException(ex, extraMessage: $"GetAuditLogsForDepartmentPagedAsync DepartmentId: {departmentId}");
81+
82+
throw;
83+
}
84+
}
2485
}
2586
}

Repositories/Resgrid.Repositories.DataRepository/PaymentProviderEventsRepository.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1-
using Resgrid.Model;
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data.Common;
4+
using System.Threading.Tasks;
5+
using Dapper;
6+
using Resgrid.Framework;
7+
using Resgrid.Model;
28
using Resgrid.Model.Repositories;
39
using Resgrid.Model.Repositories.Connection;
410
using Resgrid.Model.Repositories.Queries;
511
using Resgrid.Repositories.DataRepository.Configs;
12+
using Resgrid.Repositories.DataRepository.Queries.Payments;
613

714
namespace Resgrid.Repositories.DataRepository
815
{
@@ -21,5 +28,46 @@ public PaymentProviderEventsRepository(IConnectionProvider connectionProvider, S
2128
_queryFactory = queryFactory;
2229
_unitOfWork = unitOfWork;
2330
}
31+
32+
public async Task<IEnumerable<PaymentProviderEvent>> GetByCustomerIdAsync(string customerId)
33+
{
34+
try
35+
{
36+
var selectFunction = new Func<DbConnection, Task<IEnumerable<PaymentProviderEvent>>>(async x =>
37+
{
38+
var dynamicParameters = new DynamicParametersExtension();
39+
dynamicParameters.Add("CustomerId", customerId);
40+
41+
var query = _queryFactory.GetQuery<SelectPaymentProviderEventsByCustomerIdQuery>();
42+
43+
return await x.QueryAsync<PaymentProviderEvent>(sql: query,
44+
param: dynamicParameters,
45+
transaction: _unitOfWork.Transaction);
46+
});
47+
48+
DbConnection conn = null;
49+
if (_unitOfWork?.Connection == null)
50+
{
51+
using (conn = _connectionProvider.Create())
52+
{
53+
await conn.OpenAsync();
54+
55+
return await selectFunction(conn);
56+
}
57+
}
58+
else
59+
{
60+
conn = _unitOfWork.CreateOrGetConnection();
61+
62+
return await selectFunction(conn);
63+
}
64+
}
65+
catch (Exception ex)
66+
{
67+
Logging.LogException(ex);
68+
69+
throw;
70+
}
71+
}
2472
}
2573
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Resgrid.Config;
2+
using Resgrid.Model;
3+
using Resgrid.Model.Repositories.Queries.Contracts;
4+
using Resgrid.Repositories.DataRepository.Configs;
5+
6+
namespace Resgrid.Repositories.DataRepository.Queries.AuditLogs
7+
{
8+
public class SelectAuditLogsForDepartmentByTypePagedQuery : ISelectQuery
9+
{
10+
private readonly SqlConfiguration _sqlConfiguration;
11+
public SelectAuditLogsForDepartmentByTypePagedQuery(SqlConfiguration sqlConfiguration) => _sqlConfiguration = sqlConfiguration;
12+
13+
public string GetQuery()
14+
{
15+
if (DataConfig.DatabaseType == DatabaseTypes.Postgres)
16+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.auditlogs WHERE departmentid = {_sqlConfiguration.ParameterNotation}DepartmentId AND logtype = {_sqlConfiguration.ParameterNotation}LogType AND loggedon >= {_sqlConfiguration.ParameterNotation}StartDate AND loggedon < {_sqlConfiguration.ParameterNotation}EndDate ORDER BY loggedon DESC LIMIT {_sqlConfiguration.ParameterNotation}PageSize OFFSET {_sqlConfiguration.ParameterNotation}Offset";
17+
18+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.[AuditLogs] WHERE [DepartmentId] = {_sqlConfiguration.ParameterNotation}DepartmentId AND [LogType] = {_sqlConfiguration.ParameterNotation}LogType AND [LoggedOn] >= {_sqlConfiguration.ParameterNotation}StartDate AND [LoggedOn] < {_sqlConfiguration.ParameterNotation}EndDate ORDER BY [LoggedOn] DESC OFFSET {_sqlConfiguration.ParameterNotation}Offset ROWS FETCH NEXT {_sqlConfiguration.ParameterNotation}PageSize ROWS ONLY";
19+
}
20+
21+
public string GetQuery<TEntity>() where TEntity : class, IEntity => GetQuery();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Resgrid.Config;
2+
using Resgrid.Model;
3+
using Resgrid.Model.Repositories.Queries.Contracts;
4+
using Resgrid.Repositories.DataRepository.Configs;
5+
6+
namespace Resgrid.Repositories.DataRepository.Queries.AuditLogs
7+
{
8+
public class SelectAuditLogsForDepartmentPagedQuery : ISelectQuery
9+
{
10+
private readonly SqlConfiguration _sqlConfiguration;
11+
public SelectAuditLogsForDepartmentPagedQuery(SqlConfiguration sqlConfiguration) => _sqlConfiguration = sqlConfiguration;
12+
13+
public string GetQuery()
14+
{
15+
if (DataConfig.DatabaseType == DatabaseTypes.Postgres)
16+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.auditlogs WHERE departmentid = {_sqlConfiguration.ParameterNotation}DepartmentId AND loggedon >= {_sqlConfiguration.ParameterNotation}StartDate AND loggedon < {_sqlConfiguration.ParameterNotation}EndDate ORDER BY loggedon DESC LIMIT {_sqlConfiguration.ParameterNotation}PageSize OFFSET {_sqlConfiguration.ParameterNotation}Offset";
17+
18+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.[AuditLogs] WHERE [DepartmentId] = {_sqlConfiguration.ParameterNotation}DepartmentId AND [LoggedOn] >= {_sqlConfiguration.ParameterNotation}StartDate AND [LoggedOn] < {_sqlConfiguration.ParameterNotation}EndDate ORDER BY [LoggedOn] DESC OFFSET {_sqlConfiguration.ParameterNotation}Offset ROWS FETCH NEXT {_sqlConfiguration.ParameterNotation}PageSize ROWS ONLY";
19+
}
20+
21+
public string GetQuery<TEntity>() where TEntity : class, IEntity => GetQuery();
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Resgrid.Config;
2+
using Resgrid.Model;
3+
using Resgrid.Model.Repositories.Queries.Contracts;
4+
using Resgrid.Repositories.DataRepository.Configs;
5+
6+
namespace Resgrid.Repositories.DataRepository.Queries.Payments
7+
{
8+
public class SelectPaymentProviderEventsByCustomerIdQuery : ISelectQuery
9+
{
10+
private readonly SqlConfiguration _sqlConfiguration;
11+
public SelectPaymentProviderEventsByCustomerIdQuery(SqlConfiguration sqlConfiguration) => _sqlConfiguration = sqlConfiguration;
12+
13+
public string GetQuery()
14+
{
15+
if (DataConfig.DatabaseType == DatabaseTypes.Postgres)
16+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.paymentproviderevents WHERE customerid = {_sqlConfiguration.ParameterNotation}CustomerId ORDER BY recievedon DESC";
17+
18+
return $"SELECT * FROM {_sqlConfiguration.SchemaName}.[PaymentProviderEvents] WHERE [CustomerId] = {_sqlConfiguration.ParameterNotation}CustomerId ORDER BY [RecievedOn] DESC";
19+
}
20+
21+
public string GetQuery<TEntity>() where TEntity : class, IEntity => GetQuery();
22+
}
23+
}

0 commit comments

Comments
 (0)