< Summary

Information
Class: LGDXRobotCloud.API.Services.Navigation.RealmService
Assembly: LGDXRobotCloud.API
File(s): /builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Services/Navigation/RealmService.cs
Line coverage
86%
Covered lines: 108
Uncovered lines: 17
Coverable lines: 125
Total lines: 171
Line coverage: 86.4%
Branch coverage
81%
Covered branches: 13
Total branches: 16
Branch coverage: 81.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)50%22100%
GetRealmsAsync()100%22100%
GetRealmAsync()100%22100%
GetDefaultRealmAsync()50%22100%
CreateRealmAsync()100%11100%
UpdateRealmAsync()100%210%
TestDeleteRealmAsync()100%66100%
DeleteRealmAsync()100%210%
SearchRealmsAsync()50%22100%

File(s)

/builds/yukaitung/lgdxrobot2-cloud/LGDXRobotCloud.API/Services/Navigation/RealmService.cs

#LineLine coverage
 1using LGDXRobotCloud.API.Exceptions;
 2using LGDXRobotCloud.Data.DbContexts;
 3using LGDXRobotCloud.Data.Entities;
 4using LGDXRobotCloud.Data.Models.Business.Navigation;
 5using LGDXRobotCloud.Utilities.Enums;
 6using LGDXRobotCloud.Utilities.Helpers;
 7using Microsoft.EntityFrameworkCore;
 8
 9namespace LGDXRobotCloud.API.Services.Navigation;
 10
 11public interface IRealmService
 12{
 13  Task<(IEnumerable<RealmListBusinessModel>, PaginationHelper)> GetRealmsAsync(string? name, int pageNumber, int pageSiz
 14  Task<RealmBusinessModel> GetRealmAsync(int id);
 15  Task<RealmBusinessModel> GetDefaultRealmAsync();
 16  Task<RealmBusinessModel> CreateRealmAsync(RealmCreateBusinessModel createModel);
 17  Task<bool> UpdateRealmAsync(int id, RealmUpdateBusinessModel updateModel);
 18  Task<bool> TestDeleteRealmAsync(int id);
 19  Task<bool> DeleteRealmAsync(int id);
 20
 21  Task<IEnumerable<RealmSearchBusinessModel>> SearchRealmsAsync(string? name);
 22}
 23
 1624public class RealmService(LgdxContext context) : IRealmService
 25{
 1626  private readonly LgdxContext _context = context ?? throw new ArgumentNullException(nameof(context));
 27
 28  public async Task<(IEnumerable<RealmListBusinessModel>, PaginationHelper)> GetRealmsAsync(string? name, int pageNumber
 429  {
 430    var query = _context.Realms as IQueryable<Realm>;
 431    if (!string.IsNullOrWhiteSpace(name))
 332    {
 333      name = name.Trim();
 334      query = query.Where(m => m.Name.ToLower().Contains(name.ToLower()));
 335    }
 436    var itemCount = await query.CountAsync();
 437    var PaginationHelper = new PaginationHelper(itemCount, pageNumber, pageSize);
 438    var realms = await query.AsNoTracking()
 439      .OrderBy(m => m.Id)
 440      .Skip(pageSize * (pageNumber - 1))
 441      .Take(pageSize)
 442      .Select(m => new RealmListBusinessModel {
 443        Id = m.Id,
 444        Name = m.Name,
 445        Description = m.Description,
 446        Resolution = m.Resolution,
 447      })
 448      .ToListAsync();
 449    return (realms, PaginationHelper);
 450  }
 51
 52  public async Task<RealmBusinessModel> GetRealmAsync(int id)
 253  {
 254    return await _context.Realms.AsNoTracking()
 255      .Where(m => m.Id == id)
 256      .Select(m => new RealmBusinessModel {
 257        Id = m.Id,
 258        Name = m.Name,
 259        Description = m.Description,
 260        Image = Convert.ToBase64String(m.Image),
 261        Resolution = m.Resolution,
 262        OriginX = m.OriginX,
 263        OriginY = m.OriginY,
 264        OriginRotation = m.OriginRotation,
 265      })
 266      .FirstOrDefaultAsync()
 267        ?? throw new LgdxNotFound404Exception();
 168  }
 69
 70  public async Task<RealmBusinessModel> GetDefaultRealmAsync()
 171  {
 172    return await _context.Realms.AsNoTracking()
 173      .OrderBy(m => m.Id)
 174      .Select(m => new RealmBusinessModel {
 175        Id = m.Id,
 176        Name = m.Name,
 177        Description = m.Description,
 178        Image = Convert.ToBase64String(m.Image),
 179        Resolution = m.Resolution,
 180        OriginX = m.OriginX,
 181        OriginY = m.OriginY,
 182        OriginRotation = m.OriginRotation,
 183      })
 184      .FirstOrDefaultAsync()
 185        ?? throw new LgdxNotFound404Exception();
 186  }
 87
 88  public async Task<RealmBusinessModel> CreateRealmAsync(RealmCreateBusinessModel createModel)
 189  {
 190    var realm = new Realm {
 191      Name = createModel.Name,
 192      Description = createModel.Description,
 193      Image = Convert.FromBase64String(createModel.Image),
 194      Resolution = createModel.Resolution,
 195      OriginX = createModel.OriginX,
 196      OriginY = createModel.OriginY,
 197      OriginRotation = createModel.OriginRotation,
 198    };
 99
 1100    await _context.Realms.AddAsync(realm);
 1101    await _context.SaveChangesAsync();
 102
 1103    return new RealmBusinessModel {
 1104      Id = realm.Id,
 1105      Name = realm.Name,
 1106      Description = realm.Description,
 1107      Image = createModel.Image,
 1108      Resolution = realm.Resolution,
 1109      OriginX = realm.OriginX,
 1110      OriginY = realm.OriginY,
 1111      OriginRotation = realm.OriginRotation,
 1112    };
 1113  }
 114
 115  public async Task<bool> UpdateRealmAsync(int id, RealmUpdateBusinessModel updateModel)
 0116  {
 0117    return await _context.Realms
 0118      .Where(m => m.Id == id)
 0119      .ExecuteUpdateAsync(setters => setters
 0120        .SetProperty(m => m.Name, updateModel.Name)
 0121        .SetProperty(m => m.Description, updateModel.Description)
 0122        .SetProperty(m => m.Image, Convert.FromBase64String(updateModel.Image))
 0123        .SetProperty(m => m.Resolution, updateModel.Resolution)
 0124        .SetProperty(m => m.OriginX, updateModel.OriginX)
 0125        .SetProperty(m => m.OriginY, updateModel.OriginY)
 0126        .SetProperty(m => m.OriginRotation, updateModel.OriginRotation)
 0127      ) == 1;
 0128  }
 129
 130  public async Task<bool> TestDeleteRealmAsync(int id)
 4131  {
 4132    var depeendencies = await _context.Robots.Where(m => m.RealmId == id).CountAsync();
 4133    if (depeendencies > 0)
 1134    {
 1135      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} robots.");
 136    }
 3137    depeendencies = await _context.Waypoints.Where(m => m.RealmId == id).CountAsync();
 3138    if (depeendencies > 0)
 1139    {
 1140      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} waypoints.");
 141    }
 2142    depeendencies = await _context.AutoTasks
 2143      .Where(m => m.RealmId == id)
 2144      .Where(m => m.CurrentProgressId != (int)ProgressState.Completed && m.CurrentProgressId != (int)ProgressState.Abort
 2145      .CountAsync();
 2146    if (depeendencies > 0)
 1147    {
 1148      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} running/waiting/tem
 149    }
 1150    return true;
 1151  }
 152
 153  public async Task<bool> DeleteRealmAsync(int id)
 0154  {
 0155    return await _context.Realms.Where(m => m.Id == id)
 0156      .ExecuteDeleteAsync() == 1;
 0157  }
 158
 159  public async Task<IEnumerable<RealmSearchBusinessModel>> SearchRealmsAsync(string? name)
 4160  {
 4161    var n = name ?? string.Empty;
 4162    return await _context.Realms.AsNoTracking()
 4163      .Where(w => w.Name.ToLower().Contains(n.ToLower()))
 4164      .Take(10)
 4165      .Select(m => new RealmSearchBusinessModel {
 4166        Id = m.Id,
 4167        Name = m.Name,
 4168      })
 4169      .ToListAsync();
 4170  }
 171}