< 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
0%
Covered lines: 0
Uncovered lines: 125
Coverable lines: 125
Total lines: 171
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 16
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%620%
GetRealmsAsync()0%620%
GetRealmAsync()0%620%
GetDefaultRealmAsync()0%620%
CreateRealmAsync()100%210%
UpdateRealmAsync()100%210%
TestDeleteRealmAsync()0%4260%
DeleteRealmAsync()100%210%
SearchRealmsAsync()0%620%

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
 024public class RealmService(LgdxContext context) : IRealmService
 25{
 026  private readonly LgdxContext _context = context ?? throw new ArgumentNullException(nameof(context));
 27
 28  public async Task<(IEnumerable<RealmListBusinessModel>, PaginationHelper)> GetRealmsAsync(string? name, int pageNumber
 029  {
 030    var query = _context.Realms as IQueryable<Realm>;
 031    if (!string.IsNullOrWhiteSpace(name))
 032    {
 033      name = name.Trim();
 034      query = query.Where(m => m.Name.Contains(name));
 035    }
 036    var itemCount = await query.CountAsync();
 037    var PaginationHelper = new PaginationHelper(itemCount, pageNumber, pageSize);
 038    var realms = await query.AsNoTracking()
 039      .OrderBy(m => m.Id)
 040      .Skip(pageSize * (pageNumber - 1))
 041      .Take(pageSize)
 042      .Select(m => new RealmListBusinessModel {
 043        Id = m.Id,
 044        Name = m.Name,
 045        Description = m.Description,
 046        Resolution = m.Resolution,
 047      })
 048      .ToListAsync();
 049    return (realms, PaginationHelper);
 050  }
 51
 52  public async Task<RealmBusinessModel> GetRealmAsync(int id)
 053  {
 054    return await _context.Realms.AsNoTracking()
 055      .Where(m => m.Id == id)
 056      .Select(m => new RealmBusinessModel {
 057        Id = m.Id,
 058        Name = m.Name,
 059        Description = m.Description,
 060        Image = Convert.ToBase64String(m.Image),
 061        Resolution = m.Resolution,
 062        OriginX = m.OriginX,
 063        OriginY = m.OriginY,
 064        OriginRotation = m.OriginRotation,
 065      })
 066      .FirstOrDefaultAsync()
 067        ?? throw new LgdxNotFound404Exception();
 068  }
 69
 70  public async Task<RealmBusinessModel> GetDefaultRealmAsync()
 071  {
 072    return await _context.Realms.AsNoTracking()
 073      .OrderBy(m => m.Id)
 074      .Select(m => new RealmBusinessModel {
 075        Id = m.Id,
 076        Name = m.Name,
 077        Description = m.Description,
 078        Image = Convert.ToBase64String(m.Image),
 079        Resolution = m.Resolution,
 080        OriginX = m.OriginX,
 081        OriginY = m.OriginY,
 082        OriginRotation = m.OriginRotation,
 083      })
 084      .FirstOrDefaultAsync()
 085        ?? throw new LgdxNotFound404Exception();
 086  }
 87
 88  public async Task<RealmBusinessModel> CreateRealmAsync(RealmCreateBusinessModel createModel)
 089  {
 090    var realm = new Realm {
 091      Name = createModel.Name,
 092      Description = createModel.Description,
 093      Image = Convert.FromBase64String(createModel.Image),
 094      Resolution = createModel.Resolution,
 095      OriginX = createModel.OriginX,
 096      OriginY = createModel.OriginY,
 097      OriginRotation = createModel.OriginRotation,
 098    };
 99
 0100    await _context.Realms.AddAsync(realm);
 0101    await _context.SaveChangesAsync();
 102
 0103    return new RealmBusinessModel {
 0104      Id = realm.Id,
 0105      Name = realm.Name,
 0106      Description = realm.Description,
 0107      Image = createModel.Image,
 0108      Resolution = realm.Resolution,
 0109      OriginX = realm.OriginX,
 0110      OriginY = realm.OriginY,
 0111      OriginRotation = realm.OriginRotation,
 0112    };
 0113  }
 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)
 0131  {
 0132    var depeendencies = await _context.Robots.Where(m => m.RealmId == id).CountAsync();
 0133    if (depeendencies > 0)
 0134    {
 0135      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} robots.");
 136    }
 0137    depeendencies = await _context.Waypoints.Where(m => m.RealmId == id).CountAsync();
 0138    if (depeendencies > 0)
 0139    {
 0140      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} waypoints.");
 141    }
 0142    depeendencies = await _context.AutoTasks
 0143      .Where(m => m.RealmId == id)
 0144      .Where(m => m.CurrentProgressId != (int)ProgressState.Completed && m.CurrentProgressId != (int)ProgressState.Abort
 0145      .CountAsync();
 0146    if (depeendencies > 0)
 0147    {
 0148      throw new LgdxValidation400Expection(nameof(id), $"This realm has been used by {depeendencies} running/waiting/tem
 149    }
 0150    return true;
 0151  }
 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)
 0160  {
 0161    var n = name ?? string.Empty;
 0162    return await _context.Realms.AsNoTracking()
 0163      .Where(w => w.Name.ToLower().Contains(n.ToLower()))
 0164      .Take(10)
 0165      .Select(m => new RealmSearchBusinessModel {
 0166        Id = m.Id,
 0167        Name = m.Name,
 0168      })
 0169      .ToListAsync();
 0170  }
 171}