< Summary

Information
Class: LGDXRobotCloud.API.Services.Administration.ActivityLogService
Assembly: LGDXRobotCloud.API
File(s): /builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Services/Administration/ActivityLogService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 99
Coverable lines: 99
Total lines: 136
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 30
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)0%7280%
GetActivityLogsAsync()0%7280%
GetActivityLogAsync()0%4260%
CreateActivityLogAsync()0%7280%

File(s)

/builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Services/Administration/ActivityLogService.cs

#LineLine coverage
 1using System.Security.Claims;
 2using LGDXRobotCloud.API.Exceptions;
 3using LGDXRobotCloud.Data.DbContexts;
 4using LGDXRobotCloud.Data.Entities;
 5using LGDXRobotCloud.Data.Models.Business.Administration;
 6using LGDXRobotCloud.Data.Models.RabbitMQ;
 7using LGDXRobotCloud.Utilities.Helpers;
 8using Microsoft.EntityFrameworkCore;
 9using Wolverine;
 10
 11namespace LGDXRobotCloud.API.Services.Administration;
 12
 13public interface IActivityLogService
 14{
 15  Task<(IEnumerable<ActivityLogListBusinessModel>, PaginationHelper)> GetActivityLogsAsync(string? entityName, string? e
 16  Task<ActivityLogBusinessModel> GetActivityLogAsync(int id);
 17  Task CreateActivityLogAsync(ActivityLogCreateBusinessModel activityLogCreateBusinessMode);
 18}
 19
 020public class ActivityLogService(
 021    LgdxLogsContext LgdxLogsContext,
 022    IMessageBus bus,
 023    IHttpContextAccessor httpContextAccessor,
 024    LgdxContext lgdxContext
 025  ) : IActivityLogService
 26{
 027  private readonly LgdxLogsContext _lgdxLogsContext = LgdxLogsContext ?? throw new ArgumentNullException(nameof(LgdxLogs
 028  private readonly IMessageBus _bus = bus ?? throw new ArgumentNullException(nameof(bus));
 029  private readonly IHttpContextAccessor _httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(na
 030  private readonly LgdxContext _lgdxContext = lgdxContext ?? throw new ArgumentNullException(nameof(lgdxContext));
 31
 32  public async Task<(IEnumerable<ActivityLogListBusinessModel>, PaginationHelper)> GetActivityLogsAsync(string? entityNa
 033  {
 034    var query = _lgdxLogsContext.ActivityLogs as IQueryable<ActivityLog>;
 035    if (!string.IsNullOrWhiteSpace(entityName))
 036    {
 037      entityName = entityName.Trim();
 038      query = query.Where(t => t.EntityName.ToLower().Contains(entityName.ToLower()));
 039    }
 040    if (!string.IsNullOrWhiteSpace(entityId))
 041    {
 042      entityId = entityId.Trim();
 043      query = query.Where(t => t.EntityId.ToLower().Contains(entityId.ToLower()));
 044    }
 045    var itemCount = await query.CountAsync();
 046    var PaginationHelper = new PaginationHelper(itemCount, pageNumber, pageSize);
 047    var activityLogs = await query.AsNoTracking()
 048      .OrderBy(t => t.Id)
 049      .Skip(pageSize * (pageNumber - 1))
 050      .Take(pageSize)
 051      .Select(t => new ActivityLogListBusinessModel
 052      {
 053        Id = t.Id,
 054        EntityName = t.EntityName,
 055        EntityId = t.EntityId,
 056        Action = (Utilities.Enums.ActivityAction)t.Action,
 057        UserId = t.UserId,
 058        CreatedAt = t.CreatedAt,
 059      })
 060      .ToListAsync();
 61
 62    // Get UserName
 063    HashSet<string> userIds = activityLogs.Where(t => t.UserId != null)
 064      .Select(t => t.UserId!.Value.ToString())
 065      .ToHashSet();
 66
 067    Dictionary<string, string?> userNames = await _lgdxContext.Users
 068      .Where(t => userIds.Contains(t.Id))
 069      .Select(t => new { t.Id, t.UserName })
 070      .ToDictionaryAsync(t => t.Id, t => t.UserName);
 71
 072    foreach (var activityLog in activityLogs)
 073    {
 074      if (activityLog.UserId != null)
 075      {
 076        activityLog.UserName = userNames[activityLog.UserId.ToString()!];
 077      }
 078    }
 79
 080    return (activityLogs, PaginationHelper);
 081  }
 82
 83  public async Task<ActivityLogBusinessModel> GetActivityLogAsync(int id)
 084  {
 085    var activityLog = await _lgdxLogsContext.ActivityLogs.AsNoTracking()
 086      .Where(t => t.Id == id)
 087      .Select(t => new ActivityLogBusinessModel
 088      {
 089        Id = t.Id,
 090        EntityName = t.EntityName,
 091        EntityId = t.EntityId,
 092        Action = (Utilities.Enums.ActivityAction)t.Action,
 093        UserId = t.UserId,
 094        ApiKeyId = t.ApiKeyId,
 095        Note = t.Note,
 096        CreatedAt = t.CreatedAt,
 097      })
 098      .SingleOrDefaultAsync() ?? throw new LgdxNotFound404Exception();
 99
 100    // Get UserName
 0101    if (activityLog.UserId != null)
 0102    {
 0103      activityLog.UserName = await _lgdxContext.Users
 0104        .Where(t => t.Id == activityLog.UserId.ToString())
 0105        .Select(t => t.UserName)
 0106        .FirstOrDefaultAsync();
 0107    }
 108
 109    // Get ApiKeyName
 0110    if (activityLog.ApiKeyId != null)
 0111    {
 0112      activityLog.ApiKeyName = await _lgdxContext.ApiKeys
 0113        .Where(t => t.Id == activityLog.ApiKeyId)
 0114        .Select(t => t.Name)
 0115        .FirstOrDefaultAsync();
 0116    }
 117
 0118    return activityLog;
 0119  }
 120
 121  public async Task CreateActivityLogAsync(ActivityLogCreateBusinessModel activityLogCreateBusinessModel)
 0122  {
 0123    var httpContext = _httpContextAccessor.HttpContext;
 0124    var userId = httpContext?.User.FindFirst(ClaimTypes.NameIdentifier)?.Value;
 0125    var apiKeyId = httpContext?.Items["ApiKeyId"] as int?;
 0126    await _bus.PublishAsync(new ActivityLogContract
 0127    {
 0128      EntityName = activityLogCreateBusinessModel.EntityName,
 0129      EntityId = activityLogCreateBusinessModel.EntityId,
 0130      Action = activityLogCreateBusinessModel.Action,
 0131      UserId = userId != null ? Guid.Parse(userId) : null,
 0132      ApiKeyId = apiKeyId,
 0133      Note = activityLogCreateBusinessModel.Note,
 0134    });
 0135  }
 136}