< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.EventService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/EventService.cs
Covered lines:5
Uncovered lines:82
Coverable lines:87
Total lines:182
Line coverage:5.7% (5 of 87)
Covered branches:0
Total branches:42
Branch coverage:0% (0 of 42)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetEvents()0%0%
GetEventKinds()0%100%
GetEventKind()0%0%
PrepeareEvents()0%100%
GetEvent()0%100%
CreateEvent()0%0%
ItemsExists()0%100%
Update()0%0%
GetEvents()0%100%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/EventService.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Text.Json;
 7using System.Threading.Tasks;
 8using SVETA.Api.Helpers;
 9using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 10using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 11using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 12using WinSolutions.Sveta.Server.Services.Interfaces;
 13using WinSolutions.Sveta.Common;
 14using WinSolutions.Sveta.Server.Domain;
 15
 16namespace WinSolutions.Sveta.Server.Services.Implements
 17{
 18    public class EventService : SvetaServiceBase, IEventService
 19    {
 20        private readonly SvetaDbContext _db;
 21        private readonly ILogger<EventService> _logger;
 22        public EventService(SvetaDbContext db, ILogger<EventService> logger, IAuthenticationService authenticationServic
 11223            : base(authenticationService)
 11224        {
 11225            _db = db;
 11226            _logger = logger;
 11227        }
 28
 29        /// <summary>
 30        /// Возвращает список событий
 31        /// </summary>
 32        /// <remarks>author i.rebenok</remarks>
 33        /// <param name="page">Любое значение ниже нуля изменится на 1, пагинация: номер страницы</param>
 34        /// <param name="limit">Любое значение ниже нуля изменится на 10, пагинация: размер страницы</param>
 35        /// <param name="filter">фильтр по значимым полям: причине или логину</param>
 36        /// <param name="entity">фильтр по имени объекта изменения. Если пусто, выводится по всем</param>
 37        /// <param name="sort">сортировать по entity, entity|desc, user, user|desc,dtcreated, по умолчанию dtcreated|des
 38        /// <param name="dateFrom">дата с</param>
 39        /// <param name="dateTo">дата по</param>
 40        /// <param name="eventKind">тип события, 0 (по умолчанию) если отдавать события всех типов(1-неизвестно,2-создан
 41        public async Task<PaginatedData<List<Event>>> GetEvents(int page, int limit, string filter, string sort, DateTim
 042        {
 043            var events = PrepeareEvents();
 044            int total = events.Count();
 45
 046            if (!dateFrom.IsNullOrMinValue())
 047            {
 048                events = events.Where(x => x.DtCreated >= dateFrom);
 049            }
 50
 051            if (!dateTo.IsNullOrMinValue())
 052            {
 053                events = events.Where(x => x.DtCreated < dateTo);
 54                //events = events.Where(x => x.DtCreated < dateTo.Value.Date.Add(new TimeSpan(0, 20, 59, 59, 999)));
 055            }
 56
 057            if (eventKind > 0)
 058            {
 059                events = events.Where(x => x.EventsKind.Id == eventKind);
 060            }
 61
 062            if(!string.IsNullOrWhiteSpace(filter))
 063            {
 064                filter = filter.Trim().ToUpper();
 065                events = events.Where(x => x.User.Login.ToUpper().Contains(filter)
 066                    || x.ReasonJson.ToUpper().Contains(filter));
 067            }
 68
 069            if (!string.IsNullOrWhiteSpace(entity))
 070            {
 071                events = events.Where(x => x.Entity.ToUpper().Contains(entity.Trim().ToUpper()));
 072            }
 73
 074            int filtered = events.Count();
 75
 076            events = (sort ?? "").ToLower() switch
 077            {
 078                "entity" => events.OrderBy(x => x.Entity),
 079                "entity|desc" => events.OrderByDescending(x => x.Entity),
 080                "user" => events.OrderBy(x => x.User.Login),
 081                "user|desc" => events.OrderByDescending(x => x.User.Login),
 082                "dtcreated" => events.OrderBy(x => x.DtCreated),
 083                _ => events.OrderByDescending(x => x.DtCreated),
 084            };
 85
 086            return new PaginatedData<List<Event>>
 087            {
 088                Result = await events.Skip(page * limit).Take(limit).ToListAsync(),
 089                TotalCount = total,
 090                TotalFilteredCount = filtered
 091            };
 092        }
 93
 94        /// <summary>
 95        /// получить типы событий
 96        /// </summary>
 97        /// <returns></returns>
 098        public async Task<List<EventsKind>> GetEventKinds() => await _db.refEventsKind
 099            .Where(d => !d.IsDeleted)
 0100            .ToListAsync();
 101        /// <summary>
 102        /// получить тип событий
 103        /// </summary>
 104        /// <param name="id">id типа</param>
 105        /// <returns></returns>
 0106        public async Task<EventsKind> GetEventKind(long id) => await _db.refEventsKind.FindAsync(id);
 107        /// <summary>
 108        /// предварительная выборка событий
 109        /// </summary>
 110        /// <returns></returns>
 0111        private IQueryable<Event> PrepeareEvents() => _db.Events
 0112            .Include(d => d.User)
 0113            .Include(d => d.EventsKind)
 0114            .Include(d => d.RecState)
 0115            .AsNoTracking()
 0116            .Where(e => !e.IsDeleted);
 117
 118        /// <summary>
 119        /// получить событие
 120        /// </summary>
 121        /// <param name="eventId"> id записи</param>
 122        /// <returns></returns>
 0123        public async Task<Event> GetEvent(long eventId) => await _db.Events
 0124            .Include(d => d.User)
 0125            .Include(d => d.EventsKind)
 0126            .Include(d => d.RecState)
 0127            .Where(e => !e.IsDeleted)
 0128            .FirstOrDefaultAsync(e => e.Id == eventId);
 129
 130        /// <summary>
 131        /// создать событие
 132        /// </summary>
 133        /// <param name="eventIn">событие</param>
 134        /// <returns></returns>
 135        public async Task CreateEvent(Event eventIn)
 0136        {
 0137           _db.Entry(eventIn.User).State = eventIn.User.Id == 0 ? EntityState.Detached : EntityState.Unchanged;
 0138            _db.Entry(eventIn.EventsKind).State = eventIn.EventsKind.Id == 0 ? EntityState.Detached : EntityState.Unchan
 0139            if (eventIn.RecState == null)
 0140                eventIn.RecState = await _db.refRecordsState.FindAsync((long)RecordState.Active);
 0141            _db.Entry(eventIn.RecState).State = eventIn.RecState.Id == 0 ? EntityState.Detached : EntityState.Unchanged;
 0142            await _db.Events.AddAsync(eventIn);
 0143            await _db.SaveChangesAsync(CurrentUserId);
 0144        }
 145
 146        /// <summary>
 147        /// проверить существование события
 148        /// </summary>
 149        /// <param name="id">id события</param>
 150        /// <returns></returns>
 0151        public async Task<bool> ItemsExists(long id) => await _db.Events
 0152             .Where(e => e.Id == id)
 0153             .Where(d => !d.IsDeleted)
 0154             .AnyAsync();
 155
 156        /// <summary>
 157        /// обновить событие
 158        /// </summary>
 159        /// <param name="data">событие</param>
 160        /// <returns></returns>
 161        public async Task Update(Event data)
 0162        {
 0163            if (!(await ItemsExists(data.Id)))
 0164            {
 0165                throw new ArgumentException($"Событие с id={data.Id} не найдено");
 166            }
 0167            _db.Events.Update(data);
 0168            await _db.SaveChangesAsync(CurrentUserId);
 0169        }
 170
 171        /// <summary>
 172        /// получить список событий
 173        /// </summary>
 174        /// <param name="recordGuid">гуид записи в объекте, где произошло изменение</param>
 175        /// <param name="entity">объект, в которомпроизошло изменение (необязательно)</param>
 176        /// <returns></returns>
 0177        public async Task<List<Event>> GetEvents(Guid recordGuid, string entity) => await PrepeareEvents()
 0178            .Where(x => x.RecordGuid == recordGuid && (string.IsNullOrWhiteSpace(entity) || x.Entity.ToLower() == entity
 0179            .OrderBy(x=>x.CreationDateTime)
 0180            .ToListAsync();
 181    }
 182}