Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions Logging/MyLogInfoKey.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using NuciLog.Core;

namespace PersonalLogManager.Logging
{
public sealed class MyLogInfoKey : LogInfoKey
{
MyLogInfoKey(string name) : base(name) { }

public static LogInfoKey Identifier => new MyLogInfoKey(nameof(Identifier));

public static LogInfoKey Template => new MyLogInfoKey(nameof(Template));

public static LogInfoKey Date => new MyLogInfoKey(nameof(Date));

public static LogInfoKey Time => new MyLogInfoKey(nameof(Time));

public static LogInfoKey TimeZone => new MyLogInfoKey(nameof(TimeZone));

public static LogInfoKey Localisation => new MyLogInfoKey(nameof(Localisation));

public static LogInfoKey Count => new MyLogInfoKey(nameof(Count));
}
}
17 changes: 17 additions & 0 deletions Logging/MyOperation.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using NuciLog.Core;

namespace PersonalLogManager.Logging
{
public sealed class MyOperation : Operation
{
MyOperation(string name) : base(name) { }

public static Operation StorePersonalLog => new MyOperation(nameof(StorePersonalLog));

public static Operation GetPersonalLogs => new MyOperation(nameof(GetPersonalLogs));

public static Operation UpdatePersonalLog => new MyOperation(nameof(UpdatePersonalLog));

public static Operation DeletePersonalLog => new MyOperation(nameof(DeletePersonalLog));
}
}
2 changes: 2 additions & 0 deletions PersonalLogManager.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
<PackageReference Include="NuciAPI" Version="3.0.0" />
<PackageReference Include="NuciAPI.Controllers" Version="2.1.0" />
<PackageReference Include="NuciDAL" Version="2.4.1" />
<PackageReference Include="NuciLog" Version="1.1.1" />
<PackageReference Include="NuciLog.Core" Version="2.4.0" />
<PackageReference Include="NuciSecurity.HMAC" Version="4.1.2" />
<PackageReference Include="NuciText.Obfuscation" Version="1.0.0" />
</ItemGroup>
Expand Down
263 changes: 196 additions & 67 deletions Service/PersonalLogService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@
using System.Text.RegularExpressions;
using AutoMapper;
using NuciDAL.Repositories;
using NuciLog.Core;
using PersonalLogManager.Api.Models;
using PersonalLogManager.DataAccess.DataObjects;
using PersonalLogManager.Logging;
using PersonalLogManager.Service.Models;
using PersonalLogManager.Service.TextBuilding;

Expand All @@ -14,109 +16,236 @@ namespace PersonalLogManager.Service
public class PersonalLogService(
IPersonalLogTextBuilderFactory logTextBuilder,
IFileRepository<PersonalLogEntity> repository,
IMapper mapper) : IPersonalLogService
IMapper mapper,
ILogger logger) : IPersonalLogService
{
private readonly Random random = new();

public void StorePersonalLog(StoreLogRequest request)
{
repository.Add(new()
IEnumerable<LogInfo> logInfos =
[
new(MyLogInfoKey.Template, request.Template),
new(MyLogInfoKey.Date, request.Date),
new(MyLogInfoKey.Time, request.Time),
new(MyLogInfoKey.TimeZone, request.TimeZone)
];

logger.Info(
MyOperation.StorePersonalLog,
OperationStatus.Started,
logInfos);

string id = $"L{random.Next(0, 1000000000):D9}";

try
{
repository.Add(new()
{
Id = id,
Date = request.Date,
Time = request.Time,
TimeZone = request.TimeZone,
Template = request.Template,
Data = request.Data,
CreatedDT = DateTime.UtcNow.ToString("o")
});

repository.ApplyChanges();
}
catch (Exception ex)
{
Id = $"L{random.Next(0, 1000000000):D9}",
Date = request.Date,
Time = request.Time,
TimeZone = request.TimeZone,
Template = request.Template,
Data = request.Data,
CreatedDT = DateTime.UtcNow.ToString("o")
});

repository.ApplyChanges();
logger.Error(
MyOperation.StorePersonalLog,
OperationStatus.Failure,
ex,
logInfos);
throw;
}

logger.Debug(
MyOperation.StorePersonalLog,
OperationStatus.Success,
logInfos,
new LogInfo(MyLogInfoKey.Identifier, id));
}

public GetLogResponse GetPersonalLogs(GetLogRequest request)
{
IEnumerable<PersonalLogEntity> logs = repository.GetAll();
IEnumerable<LogInfo> logInfos =
[
new(MyLogInfoKey.Template, request.Template),
new(MyLogInfoKey.Date, request.Date),
new(MyLogInfoKey.Time, request.Time),
new(MyLogInfoKey.Localisation, request.Localisation),
new(MyLogInfoKey.Count, request.Count)
];

if (!string.IsNullOrWhiteSpace(request.Date))
{
logs = logs.Where(log => DoesFieldMatch(log.Date, request.Date));
}
logger.Info(
MyOperation.GetPersonalLogs,
OperationStatus.Started,
logInfos);

if (!string.IsNullOrWhiteSpace(request.Time))
try
{
logs = logs.Where(log => DoesFieldMatch(log.Time, request.Time));
}
IEnumerable<PersonalLogEntity> logs = repository.GetAll();

if (!string.IsNullOrWhiteSpace(request.Template))
{
logs = logs.Where(log => DoesFieldMatch(log.Template, request.Template));
}
if (!string.IsNullOrWhiteSpace(request.Date))
{
logs = logs.Where(log => DoesFieldMatch(log.Date, request.Date));
}

if (request.Data is not null && request.Data.Count > 0)
{
foreach (string dataKey in request.Data.Keys)
if (!string.IsNullOrWhiteSpace(request.Time))
{
logs = logs.Where(log =>
log.Data is not null &&
log.Data.ContainsKey(dataKey) &&
log.Data[dataKey] is not null &&
DoesFieldMatch(
log.Data[dataKey],
request.Data[dataKey],
RegexOptions.IgnoreCase));
logs = logs.Where(log => DoesFieldMatch(log.Time, request.Time));
}

if (!string.IsNullOrWhiteSpace(request.Template))
{
logs = logs.Where(log => DoesFieldMatch(log.Template, request.Template));
}

if (request.Data is not null && request.Data.Count > 0)
{
foreach (string dataKey in request.Data.Keys)
{
logs = logs.Where(log =>
log.Data is not null &&
log.Data.ContainsKey(dataKey) &&
log.Data[dataKey] is not null &&
DoesFieldMatch(
log.Data[dataKey],
request.Data[dataKey],
RegexOptions.IgnoreCase));
}
}
}

return new GetLogResponse()
logger.Debug(
MyOperation.GetPersonalLogs,
OperationStatus.Success,
logInfos,
new LogInfo(MyLogInfoKey.Count, logs.Count()));

return new GetLogResponse()
{
Logs = [.. logs
.OrderByDescending(log => log.Date)
.ThenByDescending(log => log.Time)
.ThenBy(log => log.Template)
.ThenBy(log => log.CreatedDT)
.Take(request.Count)
.Select(log => $"{log.Id} " + logTextBuilder.BuildLogText(mapper.Map<PersonalLog>(log), request.Localisation))]
};
}
catch (Exception ex)
{
Logs = [.. logs
.OrderByDescending(log => log.Date)
.ThenByDescending(log => log.Time)
.ThenBy(log => log.Template)
.ThenBy(log => log.CreatedDT)
.Take(request.Count)
.Select(log => $"{log.Id} " + logTextBuilder.BuildLogText(mapper.Map<PersonalLog>(log), request.Localisation))]
};
logger.Error(
MyOperation.GetPersonalLogs,
OperationStatus.Failure,
ex,
logInfos);

throw;
}
}

public void UpdatePersonalLog(UpdateLogRequest request)
{
PersonalLogEntity personalLog = repository.Get(request.Identifier);
IEnumerable<LogInfo> logInfos =
[
new LogInfo(MyLogInfoKey.Identifier, request.Identifier),
new LogInfo(MyLogInfoKey.Date, request.Date),
new LogInfo(MyLogInfoKey.Time, request.Time),
new LogInfo(MyLogInfoKey.TimeZone, request.TimeZone),
new LogInfo(MyLogInfoKey.Template, request.Template)
];

if (request.Date is not null)
{
personalLog.Date = request.Date;
}
logger.Info(
MyOperation.UpdatePersonalLog,
OperationStatus.Started,
logInfos);

if (request.Time is not null)
try
{
personalLog.Time = request.Time;
}
PersonalLogEntity personalLog = repository.Get(request.Identifier);

if (request.TimeZone is not null)
{
personalLog.TimeZone = request.TimeZone;
}
if (request.Date is not null)
{
personalLog.Date = request.Date;
}

if (request.Data is not null)
{
foreach (string parameter in request.Data.Keys)
if (request.Time is not null)
{
personalLog.Data[parameter] = request.Data[parameter];
personalLog.Time = request.Time;
}
}

personalLog.UpdatedDT = DateTime.UtcNow.ToString("o");
if (request.TimeZone is not null)
{
personalLog.TimeZone = request.TimeZone;
}

if (request.Data is not null)
{
foreach (string parameter in request.Data.Keys)
{
personalLog.Data[parameter] = request.Data[parameter];
}
}

personalLog.UpdatedDT = DateTime.UtcNow.ToString("o");

repository.Update(personalLog);
repository.ApplyChanges();

repository.Update(personalLog);
repository.ApplyChanges();
logger.Debug(
MyOperation.UpdatePersonalLog,
OperationStatus.Success,
logInfos);
}
catch (Exception ex)
{
logger.Error(
MyOperation.UpdatePersonalLog,
OperationStatus.Failure,
ex,
logInfos);

throw;
}
}

public void DeletePersonalLog(DeleteLogRequest request)
{
repository.Remove(request.Identifier);
repository.ApplyChanges();
IEnumerable<LogInfo> logInfos =
[
new(MyLogInfoKey.Identifier, request.Identifier)
];

logger.Info(
MyOperation.DeletePersonalLog,
OperationStatus.Started,
logInfos);

try
{
repository.Remove(request.Identifier);
repository.ApplyChanges();
}
catch (Exception ex)
{
logger.Error(
MyOperation.DeletePersonalLog,
OperationStatus.Failure,
ex,
logInfos);

throw;
}

logger.Debug(
MyOperation.DeletePersonalLog,
OperationStatus.Success,
logInfos);
}

private static bool DoesFieldMatch(
Expand Down
4 changes: 2 additions & 2 deletions Service/TextBuilding/Localisation/EnglishTextBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1223,7 +1223,7 @@ public string BuildDeviceExternalCleaningLogText(PersonalLog log)
text += $" by {GetCleaningMethod(log.Data)}";
}

return text;
return text + GetLocation(log.Data);
}

public string BuildDeviceInternalCleaningLogText(PersonalLog log)
Expand All @@ -1235,7 +1235,7 @@ public string BuildDeviceInternalCleaningLogText(PersonalLog log)
text += $" by {GetCleaningMethod(log.Data)}";
}

return text;
return text + GetLocation(log.Data);
}

public string BuildDeviceRepairLogText(PersonalLog log)
Expand Down
Loading
Loading