Compare commits
No commits in common. "test" and "main" have entirely different histories.
@ -1,10 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Demo.Data.Exceptions
|
||||
{
|
||||
public class GroupNotFoundException : RepositoryException
|
||||
{
|
||||
public GroupNotFoundException(int groupId)
|
||||
: base($"Группа с ID {groupId} не найдена.") { }
|
||||
}
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Demo.Data.Exceptions
|
||||
{
|
||||
public class RepositoryException : Exception
|
||||
{
|
||||
public RepositoryException(string message) : base(message) { }
|
||||
}
|
||||
}
|
@ -1,10 +0,0 @@
|
||||
using System;
|
||||
|
||||
namespace Demo.Data.Exceptions
|
||||
{
|
||||
public class UserNotFoundException : RepositoryException
|
||||
{
|
||||
public UserNotFoundException(Guid userGuid)
|
||||
: base($"Пользователь с GUID {userGuid} не найден.") { }
|
||||
}
|
||||
}
|
@ -1,8 +1,15 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
public class GroupLocalEntity // Класс для локальной сущности группы
|
||||
public class GroupLocalEntity
|
||||
{
|
||||
public required int Id { get; set; } // Обязательное свойство для идентификатора
|
||||
public required string Name { get; set; } // Обязательное свойство для имени
|
||||
public required int Id { get; set; }
|
||||
public required string Name { get; set; }
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,11 +1,17 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
public class PresenceLocalEntity // Класс для локальной сущности присутствия
|
||||
internal class PresenceLocalEntity
|
||||
{
|
||||
public Guid UserGuid { get; set; } // Уникальный идентификатор пользователя (Guid)
|
||||
public int GroupId { get; set; } // Идентификатор группы
|
||||
public int LessonNumber { get; set; } // Номер урока
|
||||
public DateTime Date { get; set; } // Дата
|
||||
public bool IsAttedance { get; set; } // Признак присутствия
|
||||
public required Guid UserGuid { get; set; }
|
||||
public bool IsAttedance { get; set; } = true;
|
||||
public required DateOnly Date { get; set; }
|
||||
|
||||
public required int LessonNumber { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,16 +1,25 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
public class UserLocalEnity : IEquatable<UserLocalEnity> // Класс для локальной сущности пользователя, реализующий интерфейс IEquatable
|
||||
public class UserLocalEnity : IEquatable<UserLocalEnity>
|
||||
{
|
||||
public required string FIO { get; set; } // Обязательное свойство для ФИО
|
||||
public Guid Guid { get; set; } // Свойство для уникального идентификатора
|
||||
public required string FIO { get; set; }
|
||||
public Guid Guid { get; set; }
|
||||
|
||||
public required int GroupID { get; set; } // Обязательное свойство для идентификатора группы
|
||||
public required int GroupID { get; set; }
|
||||
|
||||
public bool Equals(UserLocalEnity? other) // Метод для сравнения двух объектов UserLocalEnity
|
||||
|
||||
|
||||
public bool Equals(UserLocalEnity? other)
|
||||
{
|
||||
if (other == null) return false; // Если другой объект равен null, возвращаем false
|
||||
return this.Guid.Equals(other.Guid); // Сравниваем Guid текущего и другого объекта
|
||||
if (other == null) return false;
|
||||
return this.Guid.Equals(other.Guid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,16 +1,22 @@
|
||||
using Demo.domain.Models; // Для доступа к моделям
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.LocalData // Пространство имен для локальных данных
|
||||
namespace Demo.Data.LocalData
|
||||
{
|
||||
public static class LocalStaticData // Статический класс для локальных данных
|
||||
public static class LocalStaticData
|
||||
{
|
||||
public static List<GroupLocalEntity> groups => new List<GroupLocalEntity>
|
||||
{
|
||||
new GroupLocalEntity{ Id = 1, Name = "ИП1-21" }, // Группа с идентификатором 1 и именем "ИП1-21"
|
||||
new GroupLocalEntity{ Id = 2, Name = "ИП1-22" }, // Группа с идентификатором 2 и именем "ИП1-22"
|
||||
new GroupLocalEntity{ Id = 3, Name = "ИП1-23" }, // Группа с идентификатором 3 и именем "ИП1-23"
|
||||
};
|
||||
|
||||
{
|
||||
new GroupLocalEntity{ Id = 1, Name = "ИП1-21" },
|
||||
new GroupLocalEntity{ Id = 2, Name = "ИП1-22" },
|
||||
new GroupLocalEntity{ Id = 3, Name = "ИП1-23" },
|
||||
};
|
||||
|
||||
public static List<UserLocalEnity> users => new List<UserLocalEnity>
|
||||
{
|
||||
@ -21,10 +27,5 @@ namespace Demo.Data.LocalData // Пространство имен для лок
|
||||
new UserLocalEnity{Guid=Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), FIO = "RandomFio4", GroupID = 2 },
|
||||
new UserLocalEnity{Guid=Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), FIO = "RandomFio5", GroupID = 3 },
|
||||
};
|
||||
|
||||
public static List<PresenceLocalEntity> presences => new List<PresenceLocalEntity>
|
||||
{
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,15 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
{
|
||||
public class GroupDao
|
||||
{
|
||||
public int Id { get; set; }
|
||||
public required string Name { get; set; }
|
||||
public IEnumerable<UserDao> Users { get; set; }
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
{
|
||||
public class PresenceDao
|
||||
{
|
||||
public Guid UserGuid { get; set; }
|
||||
public bool IsAttedance { get; set; } = true;
|
||||
public DateOnly Date { get; set; }
|
||||
public int LessonNumber { get; set; }
|
||||
public UserDao UserDao { get; set; }
|
||||
public int GroupId { get; set; }
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.RemoteData.RemoteDataBase.DAO
|
||||
{
|
||||
public class UserDao
|
||||
{
|
||||
public required string FIO { get; set; }
|
||||
public Guid Guid { get; set; }
|
||||
|
||||
public required int GroupID { get; set; }
|
||||
|
||||
public GroupDao Group { get; set; }
|
||||
}
|
||||
}
|
@ -1,33 +0,0 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
|
||||
namespace Demo.Data.RemoteData.RemoteDataBase
|
||||
{
|
||||
public class RemoteDatabaseContext: DbContext
|
||||
{
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseNpgsql("Host=45.67.56.214;Port=5421;Username=user11;Database=user11;Password=JSZHJyg1");
|
||||
}
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<GroupDao>().HasKey(group => group.Id);
|
||||
modelBuilder.Entity<GroupDao>().Property(group => group.Id).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<UserDao>().HasKey(user => user.Guid);
|
||||
modelBuilder.Entity<UserDao>().Property(user => user.Guid).ValueGeneratedOnAdd();
|
||||
modelBuilder.Entity<PresenceDao>().HasKey(presense => new {
|
||||
presense.UserGuid,
|
||||
presense.Date,
|
||||
presense.IsAttedance,
|
||||
presense.LessonNumber
|
||||
});
|
||||
}
|
||||
public DbSet<GroupDao> Groups { get; set; }
|
||||
public DbSet<UserDao> Users { get; set; }
|
||||
public DbSet<PresenceDao> PresenceDaos { get; set; }
|
||||
|
||||
}
|
||||
|
||||
}
|
@ -1,51 +1,41 @@
|
||||
using Demo.Data.Exceptions;
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public class GroupRepositoryImpl : IGroupRepository
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
private List<GroupLocalEntity> _groups = LocalStaticData.groups;
|
||||
|
||||
public GroupLocalEntity? GetGroupById(int groupId)
|
||||
public class GroupRepositoryImpl : IGroupRepository
|
||||
{
|
||||
return _groups.FirstOrDefault(g => g.Id == groupId);
|
||||
public bool AddGroup(GroupLocalEntity newGroup)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// Метод для получения всех групп
|
||||
public List<GroupLocalEntity> GetAllGroup() => _groups;
|
||||
|
||||
// Метод для добавления новой группы
|
||||
public bool AddGroup(GroupLocalEntity group)
|
||||
public List<GroupLocalEntity> GetAllGroup()
|
||||
{
|
||||
if (_groups.Any(g => g.Id == group.Id))
|
||||
return false;
|
||||
|
||||
group.Id = _groups.Any() ? _groups.Max(g => g.Id) + 1 : 1;
|
||||
_groups.Add(group);
|
||||
return true;
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
// Метод для обновления существующей группы
|
||||
public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
|
||||
public List<GroupLocalEntity> GetAllGroups() => LocalStaticData.groups;
|
||||
|
||||
public GroupLocalEntity GetGroupById(int groupID)
|
||||
{
|
||||
var existingGroup = GetGroupById(groupID);
|
||||
if (existingGroup == null)
|
||||
return false;
|
||||
|
||||
existingGroup.Name = updatedGroup.Name;
|
||||
return true;
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
|
||||
public bool RemoveGroupById(int groupID)
|
||||
{
|
||||
var existingGroup = GetGroupById(groupID);
|
||||
if (existingGroup == null)
|
||||
return false;
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
_groups.Remove(existingGroup);
|
||||
return true;
|
||||
public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,9 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
|
@ -1,16 +0,0 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public interface IPresenceRepository
|
||||
{
|
||||
void SavePresence(List<PresenceLocalEntity> presences);
|
||||
List<PresenceLocalEntity> GetPresenceByGroup(int groupId);
|
||||
List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date);
|
||||
void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber);
|
||||
void AddPresence(PresenceLocalEntity presence);
|
||||
}
|
||||
}
|
@ -1,18 +0,0 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public interface IUserRepository
|
||||
{
|
||||
IEnumerable<UserLocalEnity> GetAllUsers { get; }
|
||||
bool RemoveUserById(Guid userGuid);
|
||||
UserLocalEnity? UpdateUser(UserLocalEnity user);
|
||||
|
||||
}
|
||||
}
|
@ -1,62 +0,0 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public class PresenceRepositoryImpl : IPresenceRepository
|
||||
{
|
||||
private readonly List<PresenceLocalEntity> _presences = new List<PresenceLocalEntity>();
|
||||
|
||||
public void SavePresence(List<PresenceLocalEntity> presences)
|
||||
{
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
var existing = _presences.FirstOrDefault(p =>
|
||||
p.Date == presence.Date &&
|
||||
p.UserGuid == presence.UserGuid &&
|
||||
p.LessonNumber == presence.LessonNumber);
|
||||
|
||||
if (existing == null)
|
||||
{
|
||||
_presences.Add(presence);
|
||||
}
|
||||
else
|
||||
{
|
||||
existing.IsAttedance = presence.IsAttedance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AddPresence(PresenceLocalEntity presence)
|
||||
{
|
||||
if (presence == null) throw new ArgumentNullException(nameof(presence));
|
||||
|
||||
_presences.Add(presence);
|
||||
}
|
||||
|
||||
public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
|
||||
{
|
||||
return _presences.Where(p => p.GroupId == groupId).ToList();
|
||||
}
|
||||
|
||||
public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
|
||||
{
|
||||
return _presences.Where(p => p.GroupId == groupId && p.Date.Date == date.Date).ToList();
|
||||
}
|
||||
|
||||
public void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber)
|
||||
{
|
||||
foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
|
||||
{
|
||||
var presence = _presences.FirstOrDefault(p => p.UserGuid == userGuid && p.GroupId == groupId && p.LessonNumber == lesson);
|
||||
if (presence != null)
|
||||
{
|
||||
presence.IsAttedance = false; // Помечаем как отсутствующего
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,71 +0,0 @@
|
||||
using Demo.Data.Exceptions;
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.domain.Models;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
public class SQLGroupRepositoryImpl : IGroupRepository
|
||||
{
|
||||
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||
|
||||
public SQLGroupRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||
{
|
||||
_remoteDatabaseContext = remoteDatabaseContext;
|
||||
}
|
||||
|
||||
// Метод для получения группы по ID
|
||||
public GroupLocalEntity? GetGroupById(int groupId)
|
||||
{
|
||||
var groupDao = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupId);
|
||||
return groupDao != null ? new GroupLocalEntity { Id = groupDao.Id, Name = groupDao.Name } : null;
|
||||
}
|
||||
|
||||
// Метод для получения всех групп
|
||||
public List<GroupLocalEntity> GetAllGroup()
|
||||
{
|
||||
return _remoteDatabaseContext.Groups
|
||||
.Select(group => new GroupLocalEntity {
|
||||
Id = group.Id,
|
||||
Name = group.Name
|
||||
}).ToList();
|
||||
}
|
||||
|
||||
// Метод для добавления новой группы
|
||||
public bool AddGroup(GroupLocalEntity group)
|
||||
{
|
||||
if (_remoteDatabaseContext.Groups.Any(g => g.Id == group.Id))
|
||||
return false;
|
||||
|
||||
var groupDao = new GroupDao { Id = group.Id, Name = group.Name };
|
||||
_remoteDatabaseContext.Groups.Add(groupDao);
|
||||
_remoteDatabaseContext.SaveChanges();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Метод для обновления существующей группы
|
||||
public bool UpdateGroupById(int groupID, GroupLocalEntity updatedGroup)
|
||||
{
|
||||
var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
|
||||
if (existingGroup == null)
|
||||
return false;
|
||||
|
||||
existingGroup.Name = updatedGroup.Name;
|
||||
_remoteDatabaseContext.SaveChanges();
|
||||
return true;
|
||||
}
|
||||
|
||||
// Метод для удаления группы по ID
|
||||
public bool RemoveGroupById(int groupID)
|
||||
{
|
||||
var existingGroup = _remoteDatabaseContext.Groups.FirstOrDefault(g => g.Id == groupID);
|
||||
if (existingGroup == null)
|
||||
return false;
|
||||
|
||||
_remoteDatabaseContext.Groups.Remove(existingGroup);
|
||||
_remoteDatabaseContext.SaveChanges();
|
||||
return true;
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public class SQLPresenceRepositoryImpl : IPresenceRepository
|
||||
{
|
||||
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||
|
||||
public SQLPresenceRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||
{
|
||||
_remoteDatabaseContext = remoteDatabaseContext;
|
||||
}
|
||||
|
||||
public void SavePresence(List<PresenceLocalEntity> presences)
|
||||
{
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
var existing = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
|
||||
p.Date == DateOnly.FromDateTime(presence.Date) &&
|
||||
p.UserGuid == presence.UserGuid &&
|
||||
p.LessonNumber == presence.LessonNumber);
|
||||
|
||||
if (existing == null)
|
||||
{
|
||||
var newPresence = new PresenceDao
|
||||
{
|
||||
Date = DateOnly.FromDateTime(presence.Date),
|
||||
UserGuid = presence.UserGuid,
|
||||
LessonNumber = presence.LessonNumber,
|
||||
IsAttedance = presence.IsAttedance,
|
||||
GroupId = presence.GroupId
|
||||
};
|
||||
_remoteDatabaseContext.PresenceDaos.Add(newPresence);
|
||||
}
|
||||
else
|
||||
{
|
||||
existing.IsAttedance = presence.IsAttedance;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AddPresence(PresenceLocalEntity presence)
|
||||
{
|
||||
if (presence == null) throw new ArgumentNullException(nameof(presence));
|
||||
|
||||
var newPresence = new PresenceDao
|
||||
{
|
||||
Date = DateOnly.FromDateTime(presence.Date),
|
||||
UserGuid = presence.UserGuid,
|
||||
LessonNumber = presence.LessonNumber,
|
||||
IsAttedance = presence.IsAttedance,
|
||||
GroupId = presence.GroupId // Если у вас есть это свойство
|
||||
};
|
||||
_remoteDatabaseContext.PresenceDaos.Add(newPresence);
|
||||
}
|
||||
|
||||
public List<PresenceLocalEntity> GetPresenceByGroup(int groupId)
|
||||
{
|
||||
return _remoteDatabaseContext.PresenceDaos
|
||||
.Where(p => p.GroupId == groupId)
|
||||
.Select(p => new PresenceLocalEntity
|
||||
{
|
||||
Date = p.Date.ToDateTime(TimeOnly.MinValue),
|
||||
UserGuid = p.UserGuid,
|
||||
LessonNumber = p.LessonNumber,
|
||||
IsAttedance = p.IsAttedance,
|
||||
GroupId = p.GroupId
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public List<PresenceLocalEntity> GetPresenceByGroupAndDate(int groupId, DateTime date)
|
||||
{
|
||||
return _remoteDatabaseContext.PresenceDaos
|
||||
.Where(p => p.GroupId == groupId && p.Date == DateOnly.FromDateTime(date))
|
||||
.Select(p => new PresenceLocalEntity
|
||||
{
|
||||
Date = p.Date.ToDateTime(TimeOnly.MinValue),
|
||||
UserGuid = p.UserGuid,
|
||||
LessonNumber = p.LessonNumber,
|
||||
IsAttedance = p.IsAttedance,
|
||||
GroupId = p.GroupId
|
||||
})
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public void MarkUserAsAbsent(Guid userGuid, int groupId, int firstLessonNumber, int lastLessonNumber)
|
||||
{
|
||||
foreach (var lesson in Enumerable.Range(firstLessonNumber, lastLessonNumber - firstLessonNumber + 1))
|
||||
{
|
||||
var presence = _remoteDatabaseContext.PresenceDaos.FirstOrDefault(p =>
|
||||
p.UserGuid == userGuid &&
|
||||
p.GroupId == groupId &&
|
||||
p.LessonNumber == lesson);
|
||||
|
||||
if (presence != null)
|
||||
{
|
||||
presence.IsAttedance = false; // Помечаем как отсутствующего
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,61 +0,0 @@
|
||||
using Demo.Data.Exceptions;
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Demo.Data.RemoteData.RemoteDataBase.DAO;
|
||||
using Demo.domain.Models;
|
||||
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public class SQLUserRepositoryImpl : IUserRepository
|
||||
{
|
||||
private readonly RemoteDatabaseContext _remoteDatabaseContext;
|
||||
|
||||
public SQLUserRepositoryImpl(RemoteDatabaseContext remoteDatabaseContext)
|
||||
{
|
||||
_remoteDatabaseContext = remoteDatabaseContext;
|
||||
}
|
||||
|
||||
// Метод для получения всех пользователей
|
||||
public IEnumerable<UserLocalEnity> GetAllUsers => _remoteDatabaseContext.Users.Select(u => new UserLocalEnity
|
||||
{
|
||||
Guid = u.Guid,
|
||||
FIO = u.FIO,
|
||||
GroupID = u.GroupID
|
||||
}).ToList();
|
||||
|
||||
// Метод для удаления пользователя по GUID
|
||||
public bool RemoveUserById(Guid userGuid)
|
||||
{
|
||||
var user = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == userGuid);
|
||||
if (user == null) throw new UserNotFoundException(userGuid);
|
||||
|
||||
_remoteDatabaseContext.Users.Remove(user); // Удаление
|
||||
|
||||
_remoteDatabaseContext.SaveChanges(); // Сохранение изменений в базе данных
|
||||
return true;
|
||||
}
|
||||
|
||||
// Метод для обновления данных пользователя
|
||||
public UserLocalEnity? UpdateUser(UserLocalEnity user)
|
||||
{
|
||||
var existingUser = _remoteDatabaseContext.Users.FirstOrDefault(u => u.Guid == user.Guid);
|
||||
if (existingUser == null) throw new UserNotFoundException(user.Guid);
|
||||
|
||||
existingUser.FIO = user.FIO;
|
||||
existingUser.GroupID = user.GroupID;
|
||||
|
||||
_remoteDatabaseContext.SaveChanges(); // Сохранение изменений в базе данных
|
||||
|
||||
// Возвращаем обновленный объект UserLocalEnity
|
||||
return new UserLocalEnity
|
||||
{
|
||||
Guid = existingUser.Guid,
|
||||
FIO = existingUser.FIO,
|
||||
GroupID = existingUser.GroupID
|
||||
};
|
||||
}
|
||||
|
||||
public IEnumerable<UserDao> GetAllUsersDao => _remoteDatabaseContext.Users.ToList(); // Дополнительный метод для DAO, если требуется
|
||||
}
|
||||
}
|
||||
|
@ -1,41 +1,47 @@
|
||||
using Demo.Data.Exceptions;
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Data.Repository
|
||||
{
|
||||
public class UserRepositoryImpl : IUserRepository
|
||||
public class UserRepositoryImpl
|
||||
{
|
||||
private List<UserLocalEnity> _users;
|
||||
public UserRepositoryImpl() {
|
||||
|
||||
public UserRepositoryImpl()
|
||||
GetAllUsers = LocalStaticData.users;
|
||||
}
|
||||
public List<UserLocalEnity> GetAllUsers
|
||||
{ get; set; }
|
||||
|
||||
public bool RemoveUserByGuid(Guid userGuid)
|
||||
{
|
||||
_users = LocalStaticData.users;
|
||||
UserLocalEnity? userLocal = GetAllUsers
|
||||
.Where(x => x.Guid == userGuid).FirstOrDefault();
|
||||
if (userLocal == null) return false;
|
||||
|
||||
return GetAllUsers.Remove(userLocal);
|
||||
}
|
||||
|
||||
public IEnumerable<UserLocalEnity> GetAllUsers => _users;
|
||||
public UserLocalEnity? GetUserByGuid(Guid userGuid) {
|
||||
UserLocalEnity? userLocal = GetAllUsers
|
||||
.Where(x => x.Guid == userGuid).FirstOrDefault();
|
||||
if (userLocal == null) return null;
|
||||
|
||||
public bool RemoveUserById(Guid userGuid) // Оставил Guid
|
||||
{
|
||||
var user = _users.FirstOrDefault(u => u.Guid == userGuid);
|
||||
if (user == null) throw new UserNotFoundException(userGuid);
|
||||
|
||||
_users.Remove(user);
|
||||
return true;
|
||||
return userLocal;
|
||||
}
|
||||
|
||||
public UserLocalEnity? UpdateUser(UserLocalEnity user)
|
||||
{
|
||||
var existingUser = _users.FirstOrDefault(u => u.Guid == user.Guid);
|
||||
if (existingUser == null) throw new UserNotFoundException(user.Guid);
|
||||
public UserLocalEnity? UpdateUser(UserLocalEnity userUpdateLocalEnity) {
|
||||
UserLocalEnity? userLocal = GetAllUsers
|
||||
.Where(x => x.Guid == userUpdateLocalEnity.Guid).FirstOrDefault();
|
||||
if (userLocal == null) return null;
|
||||
userLocal.FIO = userUpdateLocalEnity.FIO;
|
||||
userLocal.GroupID = userUpdateLocalEnity.GroupID;
|
||||
return userLocal;
|
||||
|
||||
existingUser.FIO = user.FIO;
|
||||
existingUser.GroupID = user.GroupID;
|
||||
|
||||
return existingUser;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -11,14 +11,4 @@
|
||||
<Folder Include="Data\RemoteData\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.10" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.10">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.10" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
@ -1,12 +1,14 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
// Класс для представления группы
|
||||
public class Group
|
||||
{
|
||||
// Комментарий:
|
||||
// - Id: Идентификатор группы.
|
||||
// - Name: Название группы.
|
||||
public required int Id { get; set; } // Идентификатор группы
|
||||
public required string Name { get; set; } // Название группы
|
||||
public required int Id { get; set; }
|
||||
public required string Name { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,18 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
{
|
||||
public class Presence // Класс для представления присутствия пользователя в группе
|
||||
{
|
||||
// - User: Ссылка на пользователя, который присутствует.
|
||||
// - GroupId: Идентификатор группы, в которой пользователь присутствует.
|
||||
// - IsAttedance: Флаг, указывающий на присутствие пользователя.
|
||||
// - Date: Дата присутствия.
|
||||
// - LessonNumber: Номер урока, на котором присутствует пользователь.
|
||||
public required User User { get; set; } // Ссылка на пользователя
|
||||
public required int GroupId { get; set; } // Идентификатор группы
|
||||
public bool IsAttedance { get; set; } = true; // Флаг присутствия
|
||||
public required DateTime Date { get; set; } // Дата присутствия
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
public required int LessonNumber { get; set; } // Номер урока
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
public class Presence
|
||||
{
|
||||
|
||||
public required User User { get; set; }
|
||||
public bool IsAttedance { get; set; } = true;
|
||||
public required DateOnly Date { get; set; }
|
||||
|
||||
public required int LessonNumber { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +0,0 @@
|
||||
public class GroupResponse
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public string Name { get; set; }
|
||||
}
|
@ -1,13 +1,16 @@
|
||||
namespace Demo.domain.Models // Пространство имен для моделей
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
// Класс для представления пользователя
|
||||
public class User
|
||||
{
|
||||
// - FIO: Полное имя пользователя.
|
||||
// - Guid: Уникальный идентификатор пользователя.
|
||||
// - Group: Ссылка на группу, к которой принадлежит пользователь.
|
||||
public required string FIO { get; set; } // Полное имя пользователя
|
||||
public Guid Guid { get; set; } // Уникальный идентификатор пользователя
|
||||
public required Group Group { get; set; } // Ссылка на группу пользователя
|
||||
public required string FIO { get; set; }
|
||||
public Guid Guid { get; set; }
|
||||
|
||||
public required Group Group { get; set; }
|
||||
}
|
||||
}
|
||||
|
@ -1,69 +0,0 @@
|
||||
using Demo.Data.Repository; // Для доступа к репозиториям данных
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class GroupAttendanceService
|
||||
{
|
||||
private readonly IPresenceRepository _presenceRepository;
|
||||
private readonly IUserRepository _userRepository; // Добавляем репозиторий пользователей
|
||||
|
||||
public GroupAttendanceService(IPresenceRepository presenceRepository, IUserRepository userRepository)
|
||||
{
|
||||
_presenceRepository = presenceRepository;
|
||||
_userRepository = userRepository; // Инициализируем репозиторий пользователей
|
||||
}
|
||||
|
||||
public void DisplayGroupAttendanceInfo(int groupId)
|
||||
{
|
||||
// Получаем данные о посещаемости для группы с ID groupId
|
||||
var presences = _presenceRepository.GetPresenceByGroup(groupId);
|
||||
|
||||
// Проверяем, есть ли данные о посещаемости для группы
|
||||
if (presences == null || !presences.Any())
|
||||
{
|
||||
Console.WriteLine("Нет данных о посещаемости для группы с ID: " + groupId);
|
||||
return;
|
||||
}
|
||||
|
||||
// Вычисление количества студентов
|
||||
var totalStudents = presences.Select(p => p.UserGuid).Distinct().Count(); // Предполагается, что в PresenceLocalEntity есть UserGuid
|
||||
var totalSessions = presences.Select(p => p.Date).Distinct().Count();// Вычисление количества проведенных занятий
|
||||
var totalAttendance = presences.Count(p => p.IsAttedance);// Общее количество присутствий
|
||||
|
||||
// Общий процент посещаемости
|
||||
double overallAttendancePercentage = totalSessions > 0 ? (double)totalAttendance / (totalSessions * totalStudents) * 100 : 0;
|
||||
|
||||
Console.WriteLine($"Группа ID: {groupId}");
|
||||
Console.WriteLine($"Количество студентов: {totalStudents}");
|
||||
Console.WriteLine($"Количество проведенных занятий: {totalSessions}");
|
||||
Console.WriteLine($"Общий процент посещаемости: {overallAttendancePercentage:F2}%");
|
||||
Console.WriteLine("Студенты:");
|
||||
|
||||
// Вывод информации по каждому студенту
|
||||
var studentAttendances = presences.GroupBy(p => p.UserGuid).Select(g => new
|
||||
{
|
||||
StudentName = GetStudentNameByGuid(g.Key), // Получение имени студента по его GUID
|
||||
AttendedCount = g.Count(p => p.IsAttedance), // Подсчет количества посещений
|
||||
MissedCount = g.Count(p => !p.IsAttedance) // Подсчет количества пропусков
|
||||
});
|
||||
|
||||
foreach (var student in studentAttendances)
|
||||
{
|
||||
// Процент посещаемости студента
|
||||
double attendancePercentage = totalSessions > 0
|
||||
? (double)student.AttendedCount / totalSessions * 100
|
||||
: 0;
|
||||
|
||||
var attendanceColor = attendancePercentage < 40 ? "\u001b[31m" : "\u001b[0m"; // Красный для низкого процента
|
||||
Console.WriteLine($"{attendanceColor}{student.StudentName} - Посещено: {student.AttendedCount}, Пропущено: {student.MissedCount}, Процент посещаемости: {attendancePercentage:F2}%\u001b[0m");
|
||||
}
|
||||
}
|
||||
|
||||
// Метод для получения имени студента по его GUID
|
||||
private string GetStudentNameByGuid(Guid userGuid)
|
||||
{
|
||||
var user = _userRepository.GetAllUsers.FirstOrDefault(u => u.Guid == userGuid);
|
||||
return user != null ? user.FIO : "Неизвестный студент"; // Возвращаем имя студента или "Неизвестный студент"
|
||||
}
|
||||
}
|
||||
}
|
@ -1,133 +1,45 @@
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.domain.Models;
|
||||
using Demo.domain.Models.RequestModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class GroupUseCase
|
||||
internal class GroupUseCase
|
||||
{
|
||||
private readonly IGroupRepository _repositoryGroupImpl;
|
||||
private readonly GroupRepositoryImpl _repositoryGroupImpl;
|
||||
|
||||
public GroupUseCase(IGroupRepository repositoryGroupImpl)
|
||||
public GroupUseCase(GroupRepositoryImpl repositoryGroupImpl)
|
||||
{
|
||||
_repositoryGroupImpl = repositoryGroupImpl;
|
||||
}
|
||||
|
||||
// Приватный метод для валидации имени группы
|
||||
private void ValidateGroupName(string groupName)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(groupName))
|
||||
{
|
||||
throw new ArgumentException("Имя группы не может быть пустым.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ValidateGroupId(int GroupId)
|
||||
{
|
||||
if (GroupId < 1)
|
||||
{
|
||||
throw new ArgumentException("Введите корректный ID группы.");
|
||||
}
|
||||
}
|
||||
|
||||
// Приватный метод для валидации существования группы по ID
|
||||
private GroupLocalEntity ValidateGroupExistence(int groupId)
|
||||
{
|
||||
var existingGroup = _repositoryGroupImpl.GetAllGroup().FirstOrDefault(g => g.Id == groupId);
|
||||
|
||||
if (existingGroup == null)
|
||||
{
|
||||
throw new ArgumentException("Группа не найдена.");
|
||||
}
|
||||
|
||||
return existingGroup;
|
||||
}
|
||||
|
||||
|
||||
// Метод для получения списка всех групп
|
||||
// Вывести все группы
|
||||
public List<Group> GetAllGroups()
|
||||
{
|
||||
return [.. _repositoryGroupImpl.GetAllGroup().Select(it => new Group { Id = it.Id, Name = it.Name })];
|
||||
return _repositoryGroupImpl.GetAllGroups().Select(it => new Group { Id = it.Id, Name = it.Name }).ToList();
|
||||
}
|
||||
|
||||
public void FindGroupById(int IdGroup)
|
||||
{
|
||||
List<Group> GetAllGroups()
|
||||
{
|
||||
return [.. _repositoryGroupImpl.GetAllGroup().Select(
|
||||
it => new Group
|
||||
{ Id = it.Id, Name = it.Name }
|
||||
)
|
||||
];
|
||||
}
|
||||
foreach (var group in GetAllGroups())
|
||||
{
|
||||
if (IdGroup == group.Id)
|
||||
{
|
||||
Console.WriteLine($"ID группы: {group.Id} Название группы: {group.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Метод для добавления новой группы
|
||||
// Создать новую группу
|
||||
public void AddGroup(string groupName)
|
||||
{
|
||||
ValidateGroupName(groupName);
|
||||
|
||||
var newId = _repositoryGroupImpl.GetAllGroup().Any() ? _repositoryGroupImpl.GetAllGroup().Max(g => g.Id) + 1 : 1;
|
||||
|
||||
var newId = _repositoryGroupImpl.GetAllGroups().Max(g => g.Id) + 1;
|
||||
GroupLocalEntity newGroup = new GroupLocalEntity
|
||||
{
|
||||
Id = newId,
|
||||
Name = groupName
|
||||
};
|
||||
|
||||
_repositoryGroupImpl.AddGroup(newGroup);
|
||||
}
|
||||
|
||||
public void RemoveGroupById(int groupId)
|
||||
{
|
||||
ValidateGroupId(groupId);
|
||||
var existingGroup = ValidateGroupExistence(groupId);
|
||||
List<Group> _groups = GetAllGroups();
|
||||
|
||||
// Находим группу по ID и удаляем ее
|
||||
var groupToRemove = _groups.FirstOrDefault(g => g.Id == existingGroup.Id);
|
||||
if (groupToRemove != null)
|
||||
{
|
||||
_groups.Remove(groupToRemove);
|
||||
_repositoryGroupImpl.RemoveGroupById(existingGroup.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new ArgumentException("Группа не найдена.");
|
||||
// Обработка случая, если группа не найдена (например, выброс исключения)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Метод для изменения названия группы
|
||||
// Изменить название группы по ID
|
||||
public void UpdateGroup(int groupId, string newGroupName)
|
||||
{
|
||||
ValidateGroupName(newGroupName);
|
||||
var existingGroup = ValidateGroupExistence(groupId);
|
||||
|
||||
GroupLocalEntity existingGroup = _repositoryGroupImpl.GetAllGroups().FirstOrDefault(g => g.Id == groupId);
|
||||
existingGroup.Name = newGroupName;
|
||||
_repositoryGroupImpl.UpdateGroupById(existingGroup.Id, existingGroup);
|
||||
|
||||
|
||||
}
|
||||
|
||||
public List<GroupResponse> getAllGroup()
|
||||
{
|
||||
return _repository.GetAllGroup().Select(Group => new GroupResponse
|
||||
{
|
||||
Id = Group.Id,
|
||||
Name = Group.Name,
|
||||
}
|
||||
).ToList();
|
||||
_repositoryGroupImpl.UpdateGroup(existingGroup);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,78 +0,0 @@
|
||||
using Demo.Data.Repository;
|
||||
using Demo.domain.Models;
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class UseCaseGeneratePresence
|
||||
{
|
||||
public readonly IUserRepository _userRepository;
|
||||
public readonly IPresenceRepository _presenceRepository;
|
||||
|
||||
public List<PresenceLocalEntity> GetPresenceByDateAndGroup(int groupId, DateTime date)
|
||||
{
|
||||
return _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
|
||||
}
|
||||
|
||||
|
||||
public UseCaseGeneratePresence(IUserRepository userRepository, IPresenceRepository presenceRepository)
|
||||
{
|
||||
_userRepository = userRepository;
|
||||
_presenceRepository = presenceRepository;
|
||||
}
|
||||
|
||||
|
||||
public void GeneratePresenceDaily(int firstLesson, int lastLesson, int groupId, DateTime currentDate)
|
||||
{
|
||||
var users = _userRepository.GetAllUsers.Where(u => u.GroupID == groupId).ToList();
|
||||
List<PresenceLocalEntity> presences = new List<PresenceLocalEntity>();
|
||||
for (int lessonNumber = firstLesson; lessonNumber <= lastLesson; lessonNumber++)
|
||||
{
|
||||
foreach (var user in users)
|
||||
{
|
||||
presences.Add(new PresenceLocalEntity
|
||||
{
|
||||
UserGuid = user.Guid,
|
||||
GroupId = user.GroupID,
|
||||
Date = currentDate,
|
||||
LessonNumber = lessonNumber,
|
||||
IsAttedance = true
|
||||
});
|
||||
}
|
||||
_presenceRepository.SavePresence(presences);
|
||||
}
|
||||
}
|
||||
|
||||
public void GenerateWeeklyPresence(int firstLesson, int lastLesson, int groupId, DateTime startTime)
|
||||
{
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
DateTime currentTime = startTime.AddDays(i);
|
||||
GeneratePresenceDaily(firstLesson, lastLesson, groupId, currentTime);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Отметить пользователя как отсутствующего на диапазоне занятий
|
||||
public void MarkUserAbsentForLessons(Guid userGuid, int groupId, int firstLesson, int lastLesson, DateTime date)
|
||||
{
|
||||
var presences = _presenceRepository.GetPresenceByGroupAndDate(groupId, date);
|
||||
foreach (var presence in presences.Where(p => p.UserGuid == userGuid && p.LessonNumber >= firstLesson && p.LessonNumber <= lastLesson))
|
||||
{
|
||||
presence.IsAttedance = false;
|
||||
}
|
||||
_presenceRepository.SavePresence(presences);
|
||||
}
|
||||
|
||||
|
||||
// Возвращаем список объектов PresenceLocalEntity на основе groupId
|
||||
public List<PresenceLocalEntity> GetAllPresenceByGroup(int groupId)
|
||||
{
|
||||
return _presenceRepository.GetPresenceByGroup(groupId);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -1,58 +1,27 @@
|
||||
using Demo.Data.Exceptions;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.Data.Repository;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class UserUseCase
|
||||
{
|
||||
private readonly IUserRepository _repositoryUserImpl;
|
||||
private readonly UserRepositoryImpl _repositoryUserImpl;
|
||||
private readonly IGroupRepository _repositoryGroupImpl;
|
||||
|
||||
public UserUseCase(IUserRepository repositoryImpl, IGroupRepository repositoryGroupImpl)
|
||||
public UserUseCase(UserRepositoryImpl repositoryImpl, IGroupRepository repositoryGroupImpl)
|
||||
{
|
||||
_repositoryUserImpl = repositoryImpl;
|
||||
_repositoryGroupImpl = repositoryGroupImpl;
|
||||
}
|
||||
|
||||
// Приватный метод для валидации ФИО пользователя
|
||||
private void ValidateUserFIO(string fio)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(fio))
|
||||
{
|
||||
throw new ArgumentException("ФИО не может быть пустым.");
|
||||
}
|
||||
}
|
||||
private List<Group> GetAllGroups() => _repositoryGroupImpl.GetAllGroup()
|
||||
.Select(it => new Group { Id = it.Id, Name = it.Name }).ToList();
|
||||
|
||||
// Приватный метод для валидации существования пользователя по ID
|
||||
private UserLocalEnity ValidateUserExistence(Guid userGuid)
|
||||
{
|
||||
var user = _repositoryUserImpl.GetAllUsers
|
||||
.FirstOrDefault(u => u.Guid == userGuid);
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
throw new Exception("Пользователь не найден.");
|
||||
}
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
// Приватный метод для валидации существования группы по ID
|
||||
private GroupLocalEntity ValidateGroupExistence(int groupId)
|
||||
{
|
||||
var group = _repositoryGroupImpl.GetAllGroup()
|
||||
.FirstOrDefault(g => g.Id == groupId);
|
||||
|
||||
if (group == null)
|
||||
{
|
||||
throw new Exception("Группа не найдена.");
|
||||
}
|
||||
|
||||
return group;
|
||||
}
|
||||
|
||||
// Вывести всех пользователей
|
||||
public List<User> GetAllUsers() => _repositoryUserImpl.GetAllUsers
|
||||
.Join(_repositoryGroupImpl.GetAllGroup(),
|
||||
user => user.GroupID,
|
||||
@ -63,66 +32,44 @@ namespace Demo.Domain.UseCase
|
||||
FIO = user.FIO,
|
||||
Guid = user.Guid,
|
||||
Group = new Group { Id = group.Id, Name = group.Name }
|
||||
}).ToList();
|
||||
}
|
||||
).ToList();
|
||||
|
||||
// Удалить пользователя по id
|
||||
public bool RemoveUserById(Guid userGuid)
|
||||
// удалить пользователя по Giud
|
||||
public bool RemoveUserByGuid(Guid userGuid)
|
||||
{
|
||||
try
|
||||
{
|
||||
return _repositoryUserImpl.RemoveUserById(userGuid);
|
||||
}
|
||||
catch (UserNotFoundException ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
catch (RepositoryException ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка в репозитории: {ex.Message}");
|
||||
return false;
|
||||
}
|
||||
return _repositoryUserImpl.RemoveUserByGuid(userGuid);
|
||||
}
|
||||
|
||||
// Обновить пользователя по guid
|
||||
|
||||
// Обновить пользователя по Guid
|
||||
public User UpdateUser(User user)
|
||||
{
|
||||
ValidateUserFIO(user.FIO);
|
||||
ValidateGroupExistence(user.Group.Id);
|
||||
|
||||
UserLocalEnity userLocalEnity = new UserLocalEnity
|
||||
{
|
||||
FIO = user.FIO,
|
||||
GroupID = user.Group.Id,
|
||||
Guid = user.Guid
|
||||
};
|
||||
|
||||
UserLocalEnity userLocalEnity = new UserLocalEnity { FIO = user.FIO, GroupID = user.Group.Id, Guid = user.Guid };
|
||||
UserLocalEnity? result = _repositoryUserImpl.UpdateUser(userLocalEnity);
|
||||
|
||||
if (result == null)
|
||||
{
|
||||
throw new Exception("Ошибка при обновлении пользователя.");
|
||||
throw new Exception("");
|
||||
}
|
||||
Group? group = GetAllGroups().FirstOrDefault(it => it.Id == result!.GroupID);
|
||||
|
||||
if (group == null)
|
||||
{
|
||||
throw new Exception("");
|
||||
}
|
||||
return new User { FIO = user.FIO, Guid = user.Guid, Group = group };
|
||||
}
|
||||
|
||||
var groupEntity = ValidateGroupExistence(result.GroupID);
|
||||
// Найти пользователя по Guid
|
||||
public User FindUserByGuid(Guid userGuid)
|
||||
{
|
||||
var user = _repositoryUserImpl.GetAllUsers
|
||||
.FirstOrDefault(u => u.Guid == userGuid);
|
||||
if (user == null) throw new Exception("Пользователь не найден");
|
||||
|
||||
return new User
|
||||
{
|
||||
FIO = result.FIO,
|
||||
Guid = result.Guid,
|
||||
Group = new Group
|
||||
{
|
||||
Id = groupEntity.Id,
|
||||
Name = groupEntity.Name
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// Найти пользователя по id
|
||||
public User FindUserById(Guid userGuid)
|
||||
{
|
||||
var user = ValidateUserExistence(userGuid);
|
||||
var group = ValidateGroupExistence(user.GroupID);
|
||||
var group = _repositoryGroupImpl.GetAllGroup()
|
||||
.FirstOrDefault(g => g.Id == user.GroupID);
|
||||
|
||||
return new User
|
||||
{
|
||||
@ -131,5 +78,7 @@ namespace Demo.Domain.UseCase
|
||||
Group = new Group { Id = group.Id, Name = group.Name }
|
||||
};
|
||||
}
|
||||
|
||||
//public List<Group> GetAllGroups() => _repositoryGroupImpl.GetAllGroups().Select(it => new Group { Id = it.Id, Name = it.Name }).ToList();
|
||||
}
|
||||
}
|
||||
|
121
Demo/Migrations/20241031103935_InitialCrete.Designer.cs
generated
121
Demo/Migrations/20241031103935_InitialCrete.Designer.cs
generated
@ -1,121 +0,0 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Demo.Migrations
|
||||
{
|
||||
[DbContext(typeof(RemoteDatabaseContext))]
|
||||
[Migration("20241031103935_InitialCrete")]
|
||||
partial class InitialCrete
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "8.0.10")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Groups");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.Property<Guid>("UserGuid")
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<DateOnly>("Date")
|
||||
.HasColumnType("date");
|
||||
|
||||
b.Property<bool>("IsAttedance")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("LessonNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<Guid>("UserDaoGuid")
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.HasKey("UserGuid", "Date", "IsAttedance", "LessonNumber");
|
||||
|
||||
b.HasIndex("UserDaoGuid");
|
||||
|
||||
b.ToTable("PresenceDaos");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.Property<Guid>("Guid")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<string>("FIO")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("GroupID")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Guid");
|
||||
|
||||
b.HasIndex("GroupID");
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserDaoGuid")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("UserDao");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
||||
.WithMany("Users")
|
||||
.HasForeignKey("GroupID")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Group");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||
{
|
||||
b.Navigation("Users");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
@ -1,93 +0,0 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Demo.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class InitialCrete : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Groups",
|
||||
columns: table => new
|
||||
{
|
||||
Id = table.Column<int>(type: "integer", nullable: false)
|
||||
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
|
||||
Name = table.Column<string>(type: "text", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Groups", x => x.Id);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Users",
|
||||
columns: table => new
|
||||
{
|
||||
Guid = table.Column<Guid>(type: "uuid", nullable: false),
|
||||
FIO = table.Column<string>(type: "text", nullable: false),
|
||||
GroupID = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Users", x => x.Guid);
|
||||
table.ForeignKey(
|
||||
name: "FK_Users_Groups_GroupID",
|
||||
column: x => x.GroupID,
|
||||
principalTable: "Groups",
|
||||
principalColumn: "Id",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateTable(
|
||||
name: "PresenceDaos",
|
||||
columns: table => new
|
||||
{
|
||||
UserGuid = table.Column<Guid>(type: "uuid", nullable: false),
|
||||
IsAttedance = table.Column<bool>(type: "boolean", nullable: false),
|
||||
Date = table.Column<DateOnly>(type: "date", nullable: false),
|
||||
LessonNumber = table.Column<int>(type: "integer", nullable: false),
|
||||
UserDaoGuid = table.Column<Guid>(type: "uuid", nullable: false),
|
||||
GroupId = table.Column<int>(type: "integer", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_PresenceDaos", x => new { x.UserGuid, x.Date, x.IsAttedance, x.LessonNumber });
|
||||
table.ForeignKey(
|
||||
name: "FK_PresenceDaos_Users_UserDaoGuid",
|
||||
column: x => x.UserDaoGuid,
|
||||
principalTable: "Users",
|
||||
principalColumn: "Guid",
|
||||
onDelete: ReferentialAction.Cascade);
|
||||
});
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_PresenceDaos_UserDaoGuid",
|
||||
table: "PresenceDaos",
|
||||
column: "UserDaoGuid");
|
||||
|
||||
migrationBuilder.CreateIndex(
|
||||
name: "IX_Users_GroupID",
|
||||
table: "Users",
|
||||
column: "GroupID");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "PresenceDaos");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Users");
|
||||
|
||||
migrationBuilder.DropTable(
|
||||
name: "Groups");
|
||||
}
|
||||
}
|
||||
}
|
@ -1,118 +0,0 @@
|
||||
// <auto-generated />
|
||||
using System;
|
||||
using Demo.Data.RemoteData.RemoteDataBase;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Demo.Migrations
|
||||
{
|
||||
[DbContext(typeof(RemoteDatabaseContext))]
|
||||
partial class RemoteDatabaseContextModelSnapshot : ModelSnapshot
|
||||
{
|
||||
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "8.0.10")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||
{
|
||||
b.Property<int>("Id")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("integer");
|
||||
|
||||
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
|
||||
|
||||
b.Property<string>("Name")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
b.ToTable("Groups");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.Property<Guid>("UserGuid")
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<DateOnly>("Date")
|
||||
.HasColumnType("date");
|
||||
|
||||
b.Property<bool>("IsAttedance")
|
||||
.HasColumnType("boolean");
|
||||
|
||||
b.Property<int>("LessonNumber")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int>("GroupId")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<Guid>("UserDaoGuid")
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.HasKey("UserGuid", "Date", "IsAttedance", "LessonNumber");
|
||||
|
||||
b.HasIndex("UserDaoGuid");
|
||||
|
||||
b.ToTable("PresenceDaos");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.Property<Guid>("Guid")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<string>("FIO")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("GroupID")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.HasKey("Guid");
|
||||
|
||||
b.HasIndex("GroupID");
|
||||
|
||||
b.ToTable("Users");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.PresenceDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", "UserDao")
|
||||
.WithMany()
|
||||
.HasForeignKey("UserDaoGuid")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("UserDao");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.UserDao", b =>
|
||||
{
|
||||
b.HasOne("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", "Group")
|
||||
.WithMany("Users")
|
||||
.HasForeignKey("GroupID")
|
||||
.OnDelete(DeleteBehavior.Cascade)
|
||||
.IsRequired();
|
||||
|
||||
b.Navigation("Group");
|
||||
});
|
||||
|
||||
modelBuilder.Entity("Demo.Data.RemoteData.RemoteDataBase.DAO.GroupDao", b =>
|
||||
{
|
||||
b.Navigation("Users");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
@ -1,34 +1,13 @@
|
||||
using Demo.Data.RemoteData.RemoteDataBase; // Подключаем необходимые пространства имен
|
||||
|
||||
using Demo.Data.Repository;
|
||||
using Demo.Domain.UseCase;
|
||||
using Demo.UI;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
|
||||
// Создаем экземпляр репозиториев
|
||||
IServiceCollection services = new ServiceCollection(); // Создаем коллекцию сервисов
|
||||
|
||||
// Добавляем контекст базы данных
|
||||
services.AddDbContext<RemoteDatabaseContext>();
|
||||
|
||||
// Добавляем репозитории
|
||||
services.AddSingleton<IGroupRepository, SQLGroupRepositoryImpl>();
|
||||
services.AddSingleton<IUserRepository, SQLUserRepositoryImpl>();
|
||||
services.AddSingleton<IPresenceRepository, SQLPresenceRepositoryImpl>();
|
||||
GroupRepositoryImpl groupRepositoryImpl = new GroupRepositoryImpl();
|
||||
UserRepositoryImpl userRepositoryImpl = new UserRepositoryImpl();
|
||||
UserUseCase userUseCase = new UserUseCase(userRepositoryImpl, groupRepositoryImpl);
|
||||
GroupUseCase groupUseCase = new GroupUseCase(groupRepositoryImpl);
|
||||
|
||||
// Добавляем юз-кейсы
|
||||
services.AddSingleton<UserUseCase>();
|
||||
services.AddSingleton<GroupUseCase>();
|
||||
services.AddSingleton<UseCaseGeneratePresence>();
|
||||
|
||||
// Добавляем пользовательские интерфейсы
|
||||
services.AddSingleton<GroupConsoleUI>();
|
||||
services.AddSingleton<PresenceConsole>();
|
||||
services.AddSingleton<MainMenuUI>();
|
||||
|
||||
var serviceProvider = services.BuildServiceProvider(); // Создаем провайдер сервисов
|
||||
|
||||
// Создаем пользовательский интерфейс
|
||||
MainMenuUI mainMenuUI = serviceProvider.GetService<MainMenuUI>();
|
||||
|
||||
// Выводим главное меню
|
||||
mainMenuUI.DisplayMenu(); // Выводим меню
|
||||
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase);
|
@ -1,64 +1,41 @@
|
||||
using Demo.Domain.UseCase;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class GroupConsoleUI
|
||||
internal class GroupConsoleUI
|
||||
{
|
||||
private readonly GroupUseCase _groupUseCase;
|
||||
GroupUseCase _groupUseCase;
|
||||
|
||||
public GroupConsoleUI(GroupUseCase groupUseCase)
|
||||
{
|
||||
_groupUseCase = groupUseCase;
|
||||
}
|
||||
|
||||
public void FindGroupById(int IdGroup)
|
||||
{
|
||||
_groupUseCase.FindGroupById(IdGroup);
|
||||
}
|
||||
|
||||
// Метод для отображения всех групп
|
||||
public void DisplayAllGroups()
|
||||
public void AllGroups()
|
||||
{
|
||||
Console.WriteLine("\n=== Список всех групп ===");
|
||||
StringBuilder groupOutput = new StringBuilder();
|
||||
|
||||
foreach (var group in _groupUseCase.GetAllGroups())
|
||||
foreach (var Group in _groupUseCase.GetAllGroups())
|
||||
{
|
||||
groupOutput.AppendLine($"{group.Id}\t{group.Name}");
|
||||
}
|
||||
|
||||
Console.WriteLine(groupOutput);
|
||||
Console.WriteLine("===========================\n");
|
||||
}
|
||||
|
||||
// Метод для добавления новой группы
|
||||
public void AddGroup(string groupName)
|
||||
{
|
||||
try
|
||||
{
|
||||
_groupUseCase.AddGroup(groupName);
|
||||
Console.WriteLine($"\nГруппа {groupName} добавлена.\n");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||
Console.WriteLine($"{Group.Id}\t{Group.Name}");
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveGroup(string groupIdStr)
|
||||
public void CreateGroup(string NameGroup)
|
||||
{
|
||||
int groupId = int.Parse(groupIdStr);
|
||||
_groupUseCase.RemoveGroupById(groupId);
|
||||
Console.WriteLine($"Группа с ID: {groupId} удалена");
|
||||
_groupUseCase.AddGroup(NameGroup);
|
||||
}
|
||||
|
||||
// Метод для обновления названия группы
|
||||
public void UpdateGroupName(int groupId, string newGroupName)
|
||||
public void UpdateNameGroup(int id, string name)
|
||||
{
|
||||
_groupUseCase.UpdateGroup(groupId, newGroupName);
|
||||
Console.WriteLine($"\nНазвание группы с ID {groupId} изменено на {newGroupName}.\n");
|
||||
_groupUseCase.UpdateGroup(id, name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,225 +1,85 @@
|
||||
using Demo.Domain.UseCase;
|
||||
using Demo.domain.Models;
|
||||
using Demo.Domain.UseCase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class MainMenuUI
|
||||
{
|
||||
private readonly UserConsoleUI _userConsoleUI;
|
||||
private readonly GroupConsoleUI _groupConsoleUI;
|
||||
private readonly PresenceConsole _presenceConsoleUI;
|
||||
|
||||
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCaseGeneratePresence presenceUseCase)
|
||||
UserConsoleUI _userConsoleUI;
|
||||
GroupConsoleUI _groupConsoleUI;
|
||||
|
||||
|
||||
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase)
|
||||
{
|
||||
_userConsoleUI = new UserConsoleUI(userUseCase);
|
||||
_groupConsoleUI = new GroupConsoleUI(groupUseCase);
|
||||
_presenceConsoleUI = new PresenceConsole(presenceUseCase);
|
||||
DisplayMenu();
|
||||
}
|
||||
|
||||
public void DisplayMenu()
|
||||
{
|
||||
Console.WriteLine("Начало работы");
|
||||
private void DisplayMenu() {
|
||||
while (true)
|
||||
{
|
||||
Console.WriteLine("УПРАВЛЕНИЕ ПОЛЬЗОВАТЕЛЯМИ");
|
||||
Console.WriteLine("1. Показать список всех пользователей");
|
||||
Console.WriteLine("2. Удалить пользователя по его ID");
|
||||
Console.WriteLine("3. Обновить данные пользователя по ID");
|
||||
Console.WriteLine("4. Найти пользователя по его ID");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("УПРАВЛЕНИЕ ГРУППАМИ");
|
||||
Console.WriteLine("5. Показать список всех групп");
|
||||
Console.WriteLine("6. Создать новую группу");
|
||||
Console.WriteLine("7. Удалить группу по ID");
|
||||
Console.WriteLine("8. Изменить название существующей группы");
|
||||
Console.WriteLine("9. Найти группу по ее ID");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("УПРАВЛЕНИЕ ПОСЕЩАЕМОСТЬЮ");
|
||||
Console.WriteLine("10. Сгенерировать посещаемость на текущий день");
|
||||
Console.WriteLine("11. Сгенерировать посещаемость на текущую неделю");
|
||||
Console.WriteLine("12. Показать посещаемость всех пользователей");
|
||||
Console.WriteLine("13. Отметить пользователя как отсутствующего");
|
||||
Console.WriteLine("14. Вывести посещаемость группы по ID");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("0. Выход из программы");
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.Write("Выберите команду: ");
|
||||
string command = Console.ReadLine();
|
||||
Console.WriteLine();
|
||||
|
||||
switch (command)
|
||||
Console.WriteLine("1 - Вывести всех пользователей");
|
||||
Console.WriteLine("2 - Удалить пользователя по guid");
|
||||
Console.WriteLine("3 - Обновить пользователя по guid");
|
||||
Console.WriteLine("4 - Найти пользователя по guid");
|
||||
Console.WriteLine("5 - Вывести все группы");
|
||||
Console.WriteLine("6 - Добавить группу");
|
||||
Console.WriteLine("7 - Изменить название группы");
|
||||
Console.Write("Введите номер команды: ");
|
||||
|
||||
switch (Convert.ToInt32(Console.ReadLine()))
|
||||
{
|
||||
case "1":
|
||||
// Отображение всех пользователей
|
||||
_userConsoleUI.DisplayAllUsers();
|
||||
// вывести всех пользователей
|
||||
case 1: _userConsoleUI.DisplayAllUsers(); break;
|
||||
|
||||
// удалить пользователя по guid
|
||||
case 2:
|
||||
Console.Write("Введите guid пользователя: ");
|
||||
_userConsoleUI.RemoveUserByGuid(Guid.Parse(Console.ReadLine()));
|
||||
break;
|
||||
|
||||
case "2":
|
||||
// Удаление пользователя по ID
|
||||
Console.Write("Введите ID пользователя для удаления: ");
|
||||
string inputGuid = Console.ReadLine();
|
||||
if (Guid.TryParse(inputGuid, out Guid userGuid))
|
||||
{
|
||||
_userConsoleUI.RemoveUserById(userGuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Неверный формат ID");
|
||||
}
|
||||
// обновить пользователя по guid
|
||||
case 3:
|
||||
Console.Write("Введите GUID пользователя для обновления: ");
|
||||
_userConsoleUI.UpdateUserGuid(Guid.Parse(Console.ReadLine()));
|
||||
break;
|
||||
|
||||
case "3":
|
||||
// Обновление пользователя по ID
|
||||
Console.Write("Введите ID пользователя для обновления: ");
|
||||
string updateGuidInput = Console.ReadLine();
|
||||
if (Guid.TryParse(updateGuidInput, out Guid updateUserGuid))
|
||||
{
|
||||
_userConsoleUI.UpdateUserById(updateUserGuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Неверный формат ID");
|
||||
}
|
||||
break;
|
||||
// найти пользователя по guid
|
||||
case 4:
|
||||
Console.Write("Введите GUID пользователя: ");
|
||||
_userConsoleUI.GetUserByGuid(Guid.Parse(Console.ReadLine())); break;
|
||||
|
||||
case "4":
|
||||
// Поиск пользователя по ID
|
||||
Console.Write("Введите ID пользователя для поиска: ");
|
||||
string findGuidInput = Console.ReadLine();
|
||||
if (Guid.TryParse(findGuidInput, out Guid findUserGuid))
|
||||
{
|
||||
_userConsoleUI.FindUserById(findUserGuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Неверный формат ID");
|
||||
}
|
||||
break;
|
||||
// вывести все группы
|
||||
case 5: _groupConsoleUI.AllGroups(); break;
|
||||
|
||||
case "5":
|
||||
// Отображение всех групп
|
||||
_groupConsoleUI.DisplayAllGroups();
|
||||
break;
|
||||
|
||||
case "6":
|
||||
// Добавление новой группы
|
||||
// добавить группу
|
||||
case 6:
|
||||
Console.Write("Введите название новой группы: ");
|
||||
string newGroupName = Console.ReadLine();
|
||||
_groupConsoleUI.AddGroup(newGroupName);
|
||||
break;
|
||||
|
||||
case "7":
|
||||
// Удаление группы
|
||||
Console.Write("Введите ID группы для удаления: ");
|
||||
|
||||
string groupIdForDelete = Console.ReadLine();
|
||||
|
||||
_groupConsoleUI.RemoveGroup(groupIdForDelete);
|
||||
break;
|
||||
|
||||
case "8":
|
||||
// Изменение названия группы
|
||||
Console.Write("Введите ID группы для изменения: ");
|
||||
if (int.TryParse(Console.ReadLine(), out int groupId))
|
||||
{
|
||||
Console.Write("Введите новое название группы: ");
|
||||
string newName = Console.ReadLine();
|
||||
|
||||
_groupConsoleUI.UpdateGroupName(groupId, newName);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Неверный формат ID группы");
|
||||
}
|
||||
break;
|
||||
|
||||
case "9":
|
||||
// Поиск группы
|
||||
Console.Write("Введите ID группы для поиска : ");
|
||||
if (int.TryParse(Console.ReadLine(), out int IdGroup))
|
||||
{
|
||||
_groupConsoleUI.FindGroupById(IdGroup);
|
||||
}
|
||||
break;
|
||||
|
||||
case "10":
|
||||
// Генерация посещаемости на день
|
||||
Console.Write("Введите номер первого занятия: ");
|
||||
int firstLesson = int.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите номер последнего занятия: ");
|
||||
int lastLesson = int.Parse(Console.ReadLine());
|
||||
_groupConsoleUI.CreateGroup(Console.ReadLine()); break;
|
||||
|
||||
// изменить название группы
|
||||
case 7:
|
||||
Console.Write("Введите ID группы: ");
|
||||
int groupIdForPresence = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.GeneratePresenceForDay(DateTime.Now, groupIdForPresence, firstLesson, lastLesson);
|
||||
Console.WriteLine("Посещаемость на день сгенерирована.");
|
||||
int id = Convert.ToInt32(Console.ReadLine());
|
||||
Console.Write("Введи новое название: ");
|
||||
string name = Console.ReadLine();
|
||||
_groupConsoleUI.UpdateNameGroup(id, name);
|
||||
break;
|
||||
|
||||
case "11":
|
||||
// Генерация посещаемости на неделю
|
||||
Console.Write("Введите номер первого занятия: ");
|
||||
int firstLessonForWeek = int.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите номер последнего занятия: ");
|
||||
int lastLessonForWeek = int.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите ID группы: ");
|
||||
int groupIdForWeekPresence = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.GeneratePresenceForWeek(DateTime.Now, groupIdForWeekPresence, firstLessonForWeek, lastLessonForWeek);
|
||||
Console.WriteLine("Посещаемость на неделю сгенерирована.");
|
||||
break;
|
||||
|
||||
case "12":
|
||||
// Отображение посещаемости
|
||||
Console.Write("Введите дату (гггг-мм-дд): ");
|
||||
DateTime date = DateTime.Parse(Console.ReadLine());
|
||||
Console.Write("Введите ID группы: ");
|
||||
int groupForPresenceView = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.DisplayPresence(date, groupForPresenceView);
|
||||
break;
|
||||
|
||||
case "13":
|
||||
// Отметить пользователя как отсутствующего
|
||||
Console.Write("Введите ID пользователя: ");
|
||||
userGuid = Guid.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите номер первого занятия: ");
|
||||
int firstAbsLesson = int.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите номер последнего занятия: ");
|
||||
int lastAbsLesson = int.Parse(Console.ReadLine());
|
||||
|
||||
Console.Write("Введите ID группы: ");
|
||||
int absGroupId = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.MarkUserAbsent(DateTime.Now, absGroupId, userGuid, firstAbsLesson, lastAbsLesson);
|
||||
Console.WriteLine("Пользователь отмечен как отсутствующий.");
|
||||
break;
|
||||
|
||||
case "14":
|
||||
Console.Write("Введите ID группы: ");
|
||||
int groupIdForAllPresence = int.Parse(Console.ReadLine());
|
||||
|
||||
_presenceConsoleUI.DisplayAllPresenceByGroup(groupIdForAllPresence);
|
||||
break;
|
||||
|
||||
|
||||
case "0":
|
||||
Console.WriteLine("Выход...");
|
||||
return;
|
||||
|
||||
default:
|
||||
Console.WriteLine("Неверный выбор, попробуйте снова.");
|
||||
default: DisplayMenu();
|
||||
break;
|
||||
}
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
using Demo.domain.Models;
|
||||
using Demo.Domain.UseCase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class PresenceConsole
|
||||
{
|
||||
private readonly UseCaseGeneratePresence _presenceUseCase;
|
||||
|
||||
public PresenceConsole(UseCaseGeneratePresence presenceUseCase)
|
||||
{
|
||||
_presenceUseCase = presenceUseCase;
|
||||
}
|
||||
|
||||
// Метод для генерации посещаемости на день
|
||||
public void GeneratePresenceForDay(DateTime date, int groupId, int firstLesson, int lastLesson)
|
||||
{
|
||||
try
|
||||
{
|
||||
_presenceUseCase.GeneratePresenceDaily(firstLesson, lastLesson, groupId, date);
|
||||
Console.WriteLine("Посещаемость на день успешно сгенерирована.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// Метод для генерации посещаемости на неделю
|
||||
public void GeneratePresenceForWeek(DateTime date, int groupId, int firstLesson, int lastLesson)
|
||||
{
|
||||
try
|
||||
{
|
||||
_presenceUseCase.GenerateWeeklyPresence(firstLesson, lastLesson, groupId, date);
|
||||
Console.WriteLine("Посещаемость на неделю успешно сгенерирована.");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при генерации посещаемости: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
// Метод для отображения посещаемости на конкретную дату и группу
|
||||
public void DisplayPresence(DateTime date, int groupId)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<PresenceLocalEntity> presences = _presenceUseCase.GetPresenceByDateAndGroup(groupId, date);
|
||||
|
||||
if (presences == null || presences.Count == 0)
|
||||
{
|
||||
Console.WriteLine("Нет данных о посещаемости на выбранную дату.");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine($"\n Посещаемость на {date:dd.MM.yyyy} ");
|
||||
Console.WriteLine("-----------------------------------------------------");
|
||||
|
||||
// Сохраняем номер занятия для сравнения
|
||||
int previousLessonNumber = -1;
|
||||
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
// Проверяем, изменился ли номер занятия
|
||||
if (previousLessonNumber != presence.LessonNumber)
|
||||
{
|
||||
Console.WriteLine("-----------------------------------------------------");
|
||||
Console.WriteLine($" Занятие: {presence.LessonNumber} ");
|
||||
Console.WriteLine("-----------------------------------------------------");
|
||||
previousLessonNumber = presence.LessonNumber;
|
||||
}
|
||||
|
||||
// Форматируем статус присутствия
|
||||
string status = presence.IsAttedance ? "Присутствует" : "Отсутствует";
|
||||
Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
|
||||
}
|
||||
|
||||
Console.WriteLine("-----------------------------------------------------");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void MarkUserAbsent(DateTime date, int groupId, Guid userGuid, int firstLesson, int lastLesson)
|
||||
{
|
||||
_presenceUseCase.MarkUserAbsentForLessons(userGuid, groupId, firstLesson, lastLesson, date);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public void DisplayAllPresenceByGroup(int groupId)
|
||||
{
|
||||
try
|
||||
{
|
||||
var presences = _presenceUseCase.GetAllPresenceByGroup(groupId);
|
||||
|
||||
if (presences == null || !presences.Any())
|
||||
{
|
||||
Console.WriteLine($"Нет данных о посещаемости для группы с ID: {groupId}.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Группируем записи посещаемости по дате
|
||||
var groupedPresences = presences.GroupBy(p => p.Date);
|
||||
|
||||
foreach (var group in groupedPresences)
|
||||
{
|
||||
Console.WriteLine("===================================================");
|
||||
Console.WriteLine($" Дата: {group.Key:dd.MM.yyyy} ");
|
||||
Console.WriteLine("===================================================");
|
||||
|
||||
// Сохраняем номер занятия для сравнения
|
||||
int previousLessonNumber = -1;
|
||||
|
||||
foreach (var presence in group)
|
||||
{
|
||||
// Проверяем, изменился ли номер занятия
|
||||
if (previousLessonNumber != presence.LessonNumber)
|
||||
{
|
||||
Console.WriteLine("---------------------------------------------------");
|
||||
Console.WriteLine($" Занятие: {presence.LessonNumber} ");
|
||||
Console.WriteLine("---------------------------------------------------");
|
||||
previousLessonNumber = presence.LessonNumber;
|
||||
}
|
||||
|
||||
// Форматируем статус присутствия
|
||||
string status = presence.IsAttedance ? "✅ Присутствует" : "❌ Отсутствует";
|
||||
Console.WriteLine($"Пользователь (ID: {presence.UserGuid}) - Статус: {status}");
|
||||
}
|
||||
|
||||
Console.WriteLine("---------------------------------------------------");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка при отображении посещаемости: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
@ -1,74 +1,51 @@
|
||||
using Demo.Domain.UseCase;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class UserConsoleUI
|
||||
{
|
||||
private readonly UserUseCase _userUseCase;
|
||||
|
||||
public UserConsoleUI(UserUseCase userUseCase)
|
||||
{
|
||||
UserUseCase _userUseCase;
|
||||
public UserConsoleUI(UserUseCase userUseCase) {
|
||||
_userUseCase = userUseCase;
|
||||
}
|
||||
|
||||
// Метод для отображения всех пользователей
|
||||
public void RemoveUserByGuid(Guid guidUser)
|
||||
{
|
||||
|
||||
string output = _userUseCase.RemoveUserByGuid(guidUser) ? "Пользователь удален" : "Пользователь не удален";
|
||||
Console.WriteLine(output);
|
||||
}
|
||||
|
||||
public void DisplayAllUsers()
|
||||
{
|
||||
Console.WriteLine("\n=== Список всех пользователей ===");
|
||||
StringBuilder userOutput = new StringBuilder();
|
||||
|
||||
foreach (var user in _userUseCase.GetAllUsers())
|
||||
{
|
||||
userOutput.AppendLine($"{user.Guid}\t{user.FIO}\t{user.Group.Name}");
|
||||
}
|
||||
|
||||
Console.WriteLine(userOutput);
|
||||
Console.WriteLine("===============================\n");
|
||||
}
|
||||
|
||||
// Метод для удаления пользователя по ID
|
||||
public void RemoveUserById(Guid userGuid)
|
||||
public void UpdateUserGuid(Guid guidUser)
|
||||
{
|
||||
string output = _userUseCase.RemoveUserById(userGuid) ? "Пользователь удален" : "Пользователь не найден";
|
||||
Console.WriteLine($"\n{output}\n");
|
||||
}
|
||||
|
||||
// Метод для обновления пользователя по ID
|
||||
public void UpdateUserById(Guid userGuid)
|
||||
{
|
||||
try
|
||||
{
|
||||
var user = _userUseCase.FindUserById(userGuid);
|
||||
|
||||
var user = _userUseCase.FindUserByGuid(guidUser);
|
||||
Console.WriteLine($"Текущие данные: {user.FIO}, {user.Group.Name}");
|
||||
Console.Write("\nВведите новое ФИО: ");
|
||||
Console.Write("Введите новое ФИО: ");
|
||||
string newFIO = Console.ReadLine();
|
||||
|
||||
user.FIO = newFIO;
|
||||
_userUseCase.UpdateUser(user);
|
||||
|
||||
Console.WriteLine("\nПользователь обновлен.\n");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Ошибка: {ex.Message}\n");
|
||||
}
|
||||
}
|
||||
|
||||
// Метод для поиска пользователя по ID
|
||||
public void FindUserById(Guid userGuid)
|
||||
public void GetUserByGuid(Guid guidUser)
|
||||
{
|
||||
var user = _userUseCase.FindUserById(userGuid);
|
||||
if (user != null)
|
||||
{
|
||||
Console.WriteLine($"\nПользователь найден: {user.Guid}, {user.FIO}, {user.Group.Name}\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("\nПользователь не найден.\n");
|
||||
}
|
||||
var user = _userUseCase.FindUserByGuid(guidUser);
|
||||
Console.WriteLine($"Пользователь найден: {user.Guid}, {user.FIO}, {user.Group.Name}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,813 +7,17 @@
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v8.0": {
|
||||
"Demo/1.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore": "8.0.10",
|
||||
"Microsoft.EntityFrameworkCore.Design": "8.0.10",
|
||||
"Microsoft.Extensions.DependencyInjection": "8.0.1",
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL": "8.0.10"
|
||||
},
|
||||
"runtime": {
|
||||
"Demo.dll": {}
|
||||
}
|
||||
},
|
||||
"Humanizer.Core/2.14.1": {
|
||||
"runtime": {
|
||||
"lib/net6.0/Humanizer.dll": {
|
||||
"assemblyVersion": "2.14.0.0",
|
||||
"fileVersion": "2.14.1.48190"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.1/Microsoft.Bcl.AsyncInterfaces.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Analyzers/3.3.3": {},
|
||||
"Microsoft.CodeAnalysis.Common/4.5.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.CodeAnalysis.Analyzers": "3.3.3",
|
||||
"System.Collections.Immutable": "6.0.0",
|
||||
"System.Reflection.Metadata": "6.0.1",
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0",
|
||||
"System.Text.Encoding.CodePages": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.dll": {
|
||||
"assemblyVersion": "4.5.0.0",
|
||||
"fileVersion": "4.500.23.10905"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "cs"
|
||||
},
|
||||
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "de"
|
||||
},
|
||||
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "es"
|
||||
},
|
||||
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "fr"
|
||||
},
|
||||
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "it"
|
||||
},
|
||||
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "ja"
|
||||
},
|
||||
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "ko"
|
||||
},
|
||||
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "pl"
|
||||
},
|
||||
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "pt-BR"
|
||||
},
|
||||
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "ru"
|
||||
},
|
||||
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "tr"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "zh-Hans"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.resources.dll": {
|
||||
"locale": "zh-Hant"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CodeAnalysis.CSharp/4.5.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.CodeAnalysis.Common": "4.5.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.dll": {
|
||||
"assemblyVersion": "4.5.0.0",
|
||||
"fileVersion": "4.500.23.10905"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "cs"
|
||||
},
|
||||
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "de"
|
||||
},
|
||||
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "es"
|
||||
},
|
||||
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "fr"
|
||||
},
|
||||
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "it"
|
||||
},
|
||||
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "ja"
|
||||
},
|
||||
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "ko"
|
||||
},
|
||||
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "pl"
|
||||
},
|
||||
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "pt-BR"
|
||||
},
|
||||
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "ru"
|
||||
},
|
||||
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "tr"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "zh-Hans"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": {
|
||||
"locale": "zh-Hant"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.5.0": {
|
||||
"dependencies": {
|
||||
"Humanizer.Core": "2.14.1",
|
||||
"Microsoft.CodeAnalysis.CSharp": "4.5.0",
|
||||
"Microsoft.CodeAnalysis.Common": "4.5.0",
|
||||
"Microsoft.CodeAnalysis.Workspaces.Common": "4.5.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.CSharp.Workspaces.dll": {
|
||||
"assemblyVersion": "4.5.0.0",
|
||||
"fileVersion": "4.500.23.10905"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "cs"
|
||||
},
|
||||
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "de"
|
||||
},
|
||||
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "es"
|
||||
},
|
||||
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "fr"
|
||||
},
|
||||
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "it"
|
||||
},
|
||||
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "ja"
|
||||
},
|
||||
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "ko"
|
||||
},
|
||||
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "pl"
|
||||
},
|
||||
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "pt-BR"
|
||||
},
|
||||
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "ru"
|
||||
},
|
||||
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "tr"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "zh-Hans"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.CSharp.Workspaces.resources.dll": {
|
||||
"locale": "zh-Hant"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Workspaces.Common/4.5.0": {
|
||||
"dependencies": {
|
||||
"Humanizer.Core": "2.14.1",
|
||||
"Microsoft.Bcl.AsyncInterfaces": "6.0.0",
|
||||
"Microsoft.CodeAnalysis.Common": "4.5.0",
|
||||
"System.Composition": "6.0.0",
|
||||
"System.IO.Pipelines": "6.0.3",
|
||||
"System.Threading.Channels": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netcoreapp3.1/Microsoft.CodeAnalysis.Workspaces.dll": {
|
||||
"assemblyVersion": "4.5.0.0",
|
||||
"fileVersion": "4.500.23.10905"
|
||||
}
|
||||
},
|
||||
"resources": {
|
||||
"lib/netcoreapp3.1/cs/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "cs"
|
||||
},
|
||||
"lib/netcoreapp3.1/de/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "de"
|
||||
},
|
||||
"lib/netcoreapp3.1/es/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "es"
|
||||
},
|
||||
"lib/netcoreapp3.1/fr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "fr"
|
||||
},
|
||||
"lib/netcoreapp3.1/it/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "it"
|
||||
},
|
||||
"lib/netcoreapp3.1/ja/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "ja"
|
||||
},
|
||||
"lib/netcoreapp3.1/ko/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "ko"
|
||||
},
|
||||
"lib/netcoreapp3.1/pl/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "pl"
|
||||
},
|
||||
"lib/netcoreapp3.1/pt-BR/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "pt-BR"
|
||||
},
|
||||
"lib/netcoreapp3.1/ru/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "ru"
|
||||
},
|
||||
"lib/netcoreapp3.1/tr/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "tr"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hans/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "zh-Hans"
|
||||
},
|
||||
"lib/netcoreapp3.1/zh-Hant/Microsoft.CodeAnalysis.Workspaces.resources.dll": {
|
||||
"locale": "zh-Hant"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore/8.0.10": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore.Abstractions": "8.0.10",
|
||||
"Microsoft.EntityFrameworkCore.Analyzers": "8.0.10",
|
||||
"Microsoft.Extensions.Caching.Memory": "8.0.1",
|
||||
"Microsoft.Extensions.Logging": "8.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.dll": {
|
||||
"assemblyVersion": "8.0.10.0",
|
||||
"fileVersion": "8.0.1024.46708"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Abstractions/8.0.10": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.10.0",
|
||||
"fileVersion": "8.0.1024.46708"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Analyzers/8.0.10": {},
|
||||
"Microsoft.EntityFrameworkCore.Design/8.0.10": {
|
||||
"dependencies": {
|
||||
"Humanizer.Core": "2.14.1",
|
||||
"Microsoft.CodeAnalysis.CSharp.Workspaces": "4.5.0",
|
||||
"Microsoft.EntityFrameworkCore.Relational": "8.0.10",
|
||||
"Microsoft.Extensions.DependencyModel": "8.0.2",
|
||||
"Mono.TextTemplating": "2.2.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.Design.dll": {
|
||||
"assemblyVersion": "8.0.10.0",
|
||||
"fileVersion": "8.0.1024.46708"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Relational/8.0.10": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore": "8.0.10",
|
||||
"Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.EntityFrameworkCore.Relational.dll": {
|
||||
"assemblyVersion": "8.0.10.0",
|
||||
"fileVersion": "8.0.1024.46708"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Caching.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Memory/8.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Caching.Abstractions": "8.0.0",
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
|
||||
"Microsoft.Extensions.Options": "8.0.2",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Caching.Memory.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/8.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/8.0.2": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyModel.dll": {
|
||||
"assemblyVersion": "8.0.0.2",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging/8.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection": "8.0.1",
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.2",
|
||||
"Microsoft.Extensions.Options": "8.0.2"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Logging.Abstractions.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.1024.46610"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Options/8.0.2": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
|
||||
"Microsoft.Extensions.Primitives": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Options.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.224.6711"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.Primitives/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.Primitives.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Mono.TextTemplating/2.2.1": {
|
||||
"dependencies": {
|
||||
"System.CodeDom": "4.4.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/Mono.TextTemplating.dll": {
|
||||
"assemblyVersion": "2.2.0.0",
|
||||
"fileVersion": "2.2.1.1"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Npgsql/8.0.5": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.Logging.Abstractions": "8.0.2"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Npgsql.dll": {
|
||||
"assemblyVersion": "8.0.5.0",
|
||||
"fileVersion": "8.0.5.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL/8.0.10": {
|
||||
"dependencies": {
|
||||
"Microsoft.EntityFrameworkCore": "8.0.10",
|
||||
"Microsoft.EntityFrameworkCore.Abstractions": "8.0.10",
|
||||
"Microsoft.EntityFrameworkCore.Relational": "8.0.10",
|
||||
"Npgsql": "8.0.5"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": {
|
||||
"assemblyVersion": "8.0.10.0",
|
||||
"fileVersion": "8.0.10.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.CodeDom/4.4.0": {
|
||||
"runtime": {
|
||||
"lib/netstandard2.0/System.CodeDom.dll": {
|
||||
"assemblyVersion": "4.0.0.0",
|
||||
"fileVersion": "4.6.25519.3"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Collections.Immutable/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Composition/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Composition.AttributedModel": "6.0.0",
|
||||
"System.Composition.Convention": "6.0.0",
|
||||
"System.Composition.Hosting": "6.0.0",
|
||||
"System.Composition.Runtime": "6.0.0",
|
||||
"System.Composition.TypedParts": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Composition.AttributedModel/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Composition.AttributedModel.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Composition.Convention/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Composition.AttributedModel": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Composition.Convention.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Composition.Hosting/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Composition.Runtime": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Composition.Hosting.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Composition.Runtime/6.0.0": {
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Composition.Runtime.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Composition.TypedParts/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Composition.AttributedModel": "6.0.0",
|
||||
"System.Composition.Hosting": "6.0.0",
|
||||
"System.Composition.Runtime": "6.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net6.0/System.Composition.TypedParts.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.21.52210"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.IO.Pipelines/6.0.3": {
|
||||
"runtime": {
|
||||
"lib/net6.0/System.IO.Pipelines.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.522.21309"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.Reflection.Metadata/6.0.1": {
|
||||
"dependencies": {
|
||||
"System.Collections.Immutable": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe/6.0.0": {},
|
||||
"System.Text.Encoding.CodePages/6.0.0": {
|
||||
"dependencies": {
|
||||
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
|
||||
}
|
||||
},
|
||||
"System.Threading.Channels/6.0.0": {}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"Demo/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"Humanizer.Core/2.14.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==",
|
||||
"path": "humanizer.core/2.14.1",
|
||||
"hashPath": "humanizer.core.2.14.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Bcl.AsyncInterfaces/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==",
|
||||
"path": "microsoft.bcl.asyncinterfaces/6.0.0",
|
||||
"hashPath": "microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Analyzers/3.3.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==",
|
||||
"path": "microsoft.codeanalysis.analyzers/3.3.3",
|
||||
"hashPath": "microsoft.codeanalysis.analyzers.3.3.3.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Common/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-lwAbIZNdnY0SUNoDmZHkVUwLO8UyNnyyh1t/4XsbFxi4Ounb3xszIYZaWhyj5ZjyfcwqwmtMbE7fUTVCqQEIdQ==",
|
||||
"path": "microsoft.codeanalysis.common/4.5.0",
|
||||
"hashPath": "microsoft.codeanalysis.common.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CodeAnalysis.CSharp/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-cM59oMKAOxvdv76bdmaKPy5hfj+oR+zxikWoueEB7CwTko7mt9sVKZI8Qxlov0C/LuKEG+WQwifepqL3vuTiBQ==",
|
||||
"path": "microsoft.codeanalysis.csharp/4.5.0",
|
||||
"hashPath": "microsoft.codeanalysis.csharp.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CodeAnalysis.CSharp.Workspaces/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-h74wTpmGOp4yS4hj+EvNzEiPgg/KVs2wmSfTZ81upJZOtPkJsVkgfsgtxxqmAeapjT/vLKfmYV0bS8n5MNVP+g==",
|
||||
"path": "microsoft.codeanalysis.csharp.workspaces/4.5.0",
|
||||
"hashPath": "microsoft.codeanalysis.csharp.workspaces.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.CodeAnalysis.Workspaces.Common/4.5.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-l4dDRmGELXG72XZaonnOeORyD/T5RpEu5LGHOUIhnv+MmUWDY/m1kWXGwtcgQ5CJ5ynkFiRnIYzTKXYjUs7rbw==",
|
||||
"path": "microsoft.codeanalysis.workspaces.common/4.5.0",
|
||||
"hashPath": "microsoft.codeanalysis.workspaces.common.4.5.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-PPkQdIqfR1nU3n6YgGGDk8G+eaYbaAKM1AzIQtlPNTKf10Osg3N9T+iK9AlnSA/ujsK00flPpFHVfJrbuBFS1A==",
|
||||
"path": "microsoft.entityframeworkcore/8.0.10",
|
||||
"hashPath": "microsoft.entityframeworkcore.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Abstractions/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-FV0QlcX9INY4kAD2o72uPtyOh0nZut2jB11Jf9mNYBtHay8gDLe+x4AbXFwuQg+eSvofjT7naV82e827zGfyMg==",
|
||||
"path": "microsoft.entityframeworkcore.abstractions/8.0.10",
|
||||
"hashPath": "microsoft.entityframeworkcore.abstractions.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Analyzers/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-51KkPIc0EMv/gVXhPIUi6cwJE9Mvh+PLr4Lap4naLcsoGZ0lF2SvOPgUUprwRV3MnN7nyD1XPhT5RJ/p+xFAXw==",
|
||||
"path": "microsoft.entityframeworkcore.analyzers/8.0.10",
|
||||
"hashPath": "microsoft.entityframeworkcore.analyzers.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Design/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-uGNjfKvAsql2KHRqxlK5wHo8mMC60G/FecrFKEjJgeIxtUAbSXGOgKGw/gD9flO5Fzzt1C7uxfIcr6ZsMmFkeg==",
|
||||
"path": "microsoft.entityframeworkcore.design/8.0.10",
|
||||
"hashPath": "microsoft.entityframeworkcore.design.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.EntityFrameworkCore.Relational/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-OefBEE47kGKPRPV3OT+FAW6o5BFgLk2D9EoeWVy7NbOepzUneayLQxbVE098FfedTyMwxvZQoDD9LrvZc3MadA==",
|
||||
"path": "microsoft.entityframeworkcore.relational/8.0.10",
|
||||
"hashPath": "microsoft.entityframeworkcore.relational.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3KuSxeHoNYdxVYfg2IRZCThcrlJ1XJqIXkAWikCsbm5C/bCjv7G0WoKDyuR98Q+T607QT2Zl5GsbGRkENcV2yQ==",
|
||||
"path": "microsoft.extensions.caching.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.caching.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Caching.Memory/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-HFDnhYLccngrzyGgHkjEDU5FMLn4MpOsr5ElgsBMC4yx6lJh4jeWO7fHS8+TXPq+dgxCmUa/Trl8svObmwW4QA==",
|
||||
"path": "microsoft.extensions.caching.memory/8.0.1",
|
||||
"hashPath": "microsoft.extensions.caching.memory.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Configuration.Abstractions/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
|
||||
"path": "microsoft.extensions.configuration.abstractions/8.0.0",
|
||||
"hashPath": "microsoft.extensions.configuration.abstractions.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
|
||||
"path": "microsoft.extensions.dependencyinjection/8.0.1",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyInjection.Abstractions/8.0.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg==",
|
||||
"path": "microsoft.extensions.dependencyinjection.abstractions/8.0.2",
|
||||
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.8.0.2.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/8.0.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw==",
|
||||
"path": "microsoft.extensions.dependencymodel/8.0.2",
|
||||
"hashPath": "microsoft.extensions.dependencymodel.8.0.2.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
|
||||
"path": "microsoft.extensions.logging/8.0.1",
|
||||
"hashPath": "microsoft.extensions.logging.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Logging.Abstractions/8.0.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==",
|
||||
"path": "microsoft.extensions.logging.abstractions/8.0.2",
|
||||
"hashPath": "microsoft.extensions.logging.abstractions.8.0.2.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Options/8.0.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
|
||||
"path": "microsoft.extensions.options/8.0.2",
|
||||
"hashPath": "microsoft.extensions.options.8.0.2.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.Primitives/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g==",
|
||||
"path": "microsoft.extensions.primitives/8.0.0",
|
||||
"hashPath": "microsoft.extensions.primitives.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Mono.TextTemplating/2.2.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==",
|
||||
"path": "mono.texttemplating/2.2.1",
|
||||
"hashPath": "mono.texttemplating.2.2.1.nupkg.sha512"
|
||||
},
|
||||
"Npgsql/8.0.5": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-zRG5V8cyeZLpzJlKzFKjEwkRMYIYnHWJvEor2lWXeccS2E1G2nIWYYhnukB51iz5XsWSVEtqg3AxTWM0QJ6vfg==",
|
||||
"path": "npgsql/8.0.5",
|
||||
"hashPath": "npgsql.8.0.5.nupkg.sha512"
|
||||
},
|
||||
"Npgsql.EntityFrameworkCore.PostgreSQL/8.0.10": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-gFPl9Dmxih7Yi4tZ3bITzZFzbxFMBx04gqTqcjoL2r5VEW+O2TA5UVw/wm/XW26NAJ7sg59Je0+9QrwiZt6MPQ==",
|
||||
"path": "npgsql.entityframeworkcore.postgresql/8.0.10",
|
||||
"hashPath": "npgsql.entityframeworkcore.postgresql.8.0.10.nupkg.sha512"
|
||||
},
|
||||
"System.CodeDom/4.4.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==",
|
||||
"path": "system.codedom/4.4.0",
|
||||
"hashPath": "system.codedom.4.4.0.nupkg.sha512"
|
||||
},
|
||||
"System.Collections.Immutable/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-l4zZJ1WU2hqpQQHXz1rvC3etVZN+2DLmQMO79FhOTZHMn8tDRr+WU287sbomD0BETlmKDn0ygUgVy9k5xkkJdA==",
|
||||
"path": "system.collections.immutable/6.0.0",
|
||||
"hashPath": "system.collections.immutable.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-d7wMuKQtfsxUa7S13tITC8n1cQzewuhD5iDjZtK2prwFfKVzdYtgrTHgjaV03Zq7feGQ5gkP85tJJntXwInsJA==",
|
||||
"path": "system.composition/6.0.0",
|
||||
"hashPath": "system.composition.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition.AttributedModel/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-WK1nSDLByK/4VoC7fkNiFuTVEiperuCN/Hyn+VN30R+W2ijO1d0Z2Qm0ScEl9xkSn1G2MyapJi8xpf4R8WRa/w==",
|
||||
"path": "system.composition.attributedmodel/6.0.0",
|
||||
"hashPath": "system.composition.attributedmodel.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition.Convention/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-XYi4lPRdu5bM4JVJ3/UIHAiG6V6lWWUlkhB9ab4IOq0FrRsp0F4wTyV4Dj+Ds+efoXJ3qbLqlvaUozDO7OLeXA==",
|
||||
"path": "system.composition.convention/6.0.0",
|
||||
"hashPath": "system.composition.convention.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition.Hosting/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-w/wXjj7kvxuHPLdzZ0PAUt++qJl03t7lENmb2Oev0n3zbxyNULbWBlnd5J5WUMMv15kg5o+/TCZFb6lSwfaUUQ==",
|
||||
"path": "system.composition.hosting/6.0.0",
|
||||
"hashPath": "system.composition.hosting.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition.Runtime/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-qkRH/YBaMPTnzxrS5RDk1juvqed4A6HOD/CwRcDGyPpYps1J27waBddiiq1y93jk2ZZ9wuA/kynM+NO0kb3PKg==",
|
||||
"path": "system.composition.runtime/6.0.0",
|
||||
"hashPath": "system.composition.runtime.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Composition.TypedParts/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-iUR1eHrL8Cwd82neQCJ00MpwNIBs4NZgXzrPqx8NJf/k4+mwBO0XCRmHYJT4OLSwDDqh5nBLJWkz5cROnrGhRA==",
|
||||
"path": "system.composition.typedparts/6.0.0",
|
||||
"hashPath": "system.composition.typedparts.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.IO.Pipelines/6.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ryTgF+iFkpGZY1vRQhfCzX0xTdlV3pyaTTqRu2ETbEv+HlV7O6y7hyQURnghNIXvctl5DuZ//Dpks6HdL/Txgw==",
|
||||
"path": "system.io.pipelines/6.0.3",
|
||||
"hashPath": "system.io.pipelines.6.0.3.nupkg.sha512"
|
||||
},
|
||||
"System.Reflection.Metadata/6.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-III/lNMSn0ZRBuM9m5Cgbiho5j81u0FAEagFX5ta2DKbljZ3T0IpD8j+BIiHQPeKqJppWS9bGEp6JnKnWKze0g==",
|
||||
"path": "system.reflection.metadata/6.0.1",
|
||||
"hashPath": "system.reflection.metadata.6.0.1.nupkg.sha512"
|
||||
},
|
||||
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
|
||||
"path": "system.runtime.compilerservices.unsafe/6.0.0",
|
||||
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Text.Encoding.CodePages/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ZFCILZuOvtKPauZ/j/swhvw68ZRi9ATCfvGbk1QfydmcXBkIWecWKn/250UH7rahZ5OoDBaiAudJtPvLwzw85A==",
|
||||
"path": "system.text.encoding.codepages/6.0.0",
|
||||
"hashPath": "system.text.encoding.codepages.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.Threading.Channels/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-TY8/9+tI0mNaUMgntOxxaq2ndTkdXqLSxvPmas7XEqOlv9lQtB7wLjYGd756lOaO7Dvb5r/WXhluM+0Xe87v5Q==",
|
||||
"path": "system.threading.channels/6.0.0",
|
||||
"hashPath": "system.threading.channels.6.0.0.nupkg.sha512"
|
||||
}
|
||||
}
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -6,7 +6,6 @@
|
||||
"version": "8.0.0"
|
||||
},
|
||||
"configProperties": {
|
||||
"System.Reflection.NullabilityInfoContext.IsSupported": true,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user