проект 5 #1
@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Demo.domain.Models
|
||||
{
|
||||
internal class PresenceLocalEntity
|
||||
public class PresenceLocalEntity
|
||||
{
|
||||
public required Guid UserGuid { get; set; }
|
||||
public bool IsAttedance { get; set; } = true;
|
||||
|
@ -18,7 +18,7 @@ namespace Demo.Data.LocalData
|
||||
new GroupLocalEntity{ Id = 3, Name = "ИП1-23" },
|
||||
};
|
||||
|
||||
public static List<UserLocalEnity> users => new List<UserLocalEnity>
|
||||
public static List<UserLocalEnity> users => new List<UserLocalEnity>
|
||||
{
|
||||
new UserLocalEnity{Guid=Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), FIO = "RandomFio", GroupID = 1 },
|
||||
new UserLocalEnity{Guid=Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), FIO = "RandomFio1", GroupID = 2 },
|
||||
@ -27,5 +27,43 @@ 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>
|
||||
{
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("e6b9964d-ea9f-420a-84b9-af9633bbfab9"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("8388d931-5bef-41be-a152-78f1aca980ed"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("ed174548-49ed-4503-a902-c970cbf27173"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("614c0a23-5bd5-43ae-b48e-d5750afbc282"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("efcc1473-c116-4244-b3f7-f2341a5c3003"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 1 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 2 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 3 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 4 },
|
||||
new PresenceLocalEntity { UserGuid = Guid.Parse("60640fb3-ace2-4cad-81d5-a0a58bc2dbbd"), IsAttedance = true, Date = DateOnly.FromDateTime(DateTime.Now), LessonNumber = 5 },
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -48,14 +48,14 @@ namespace Demo.Data.Repository
|
||||
|
||||
public bool AddGroup(GroupLocalEntity newGroup)
|
||||
{
|
||||
// Проверяем, существует ли группа с таким же ID
|
||||
|
||||
if (GetAllGroups.Any(g => g.Id == newGroup.Id))
|
||||
{
|
||||
return false; // Группа с таким ID уже существует
|
||||
return false;
|
||||
}
|
||||
|
||||
GetAllGroups.Add(newGroup); // Добавляем новую группу
|
||||
return true; // Успешное добавление
|
||||
GetAllGroups.Add(newGroup);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -9,7 +9,7 @@ namespace Demo.Data.Repository
|
||||
{
|
||||
public interface IGroupRepository
|
||||
{
|
||||
bool AddGroup(GroupLocalEntity newGroup); // Убедитесь, что здесь есть только один метод
|
||||
bool AddGroup(GroupLocalEntity newGroup);
|
||||
List<GroupLocalEntity> GetAllGroup();
|
||||
GroupLocalEntity GetGroupById(int groupID);
|
||||
bool RemoveGroupById(int groupID);
|
||||
|
@ -30,7 +30,7 @@ namespace Demo.Domain.UseCase
|
||||
|
||||
public bool AddGroup(GroupLocalEntity group)
|
||||
{
|
||||
// Если метод возвращает true, то группа добавлена успешно
|
||||
|
||||
return _repositoryGroupImpl.AddGroup(group);
|
||||
}
|
||||
|
||||
|
50
Demo/Domain/UseCase/UseCaseGeneratePresence.cs
Normal file
50
Demo/Domain/UseCase/UseCaseGeneratePresence.cs
Normal file
@ -0,0 +1,50 @@
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.domain.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class UseCaseGeneratePresence
|
||||
{
|
||||
public List<Presence> GenerateDailyPresence(int startLesson, int endLesson, int groupId, DateTime currentDate)
|
||||
{
|
||||
var users = LocalStaticData.users.Where(u => u.GroupID == groupId).ToList();
|
||||
var presences = new List<Presence>();
|
||||
|
||||
for (int lesson = startLesson; lesson <= endLesson; lesson++)
|
||||
{
|
||||
foreach (var user in users)
|
||||
{
|
||||
presences.Add(new Presence
|
||||
{
|
||||
User = new User
|
||||
{
|
||||
Guid = user.Guid,
|
||||
FIO = user.FIO,
|
||||
Group = new Group { Id = groupId, Name = LocalStaticData.groups.First(g => g.Id == groupId).Name }
|
||||
},
|
||||
Date = DateOnly.FromDateTime(currentDate),
|
||||
LessonNumber = lesson,
|
||||
IsAttedance = true
|
||||
});
|
||||
}
|
||||
}
|
||||
return presences;
|
||||
}
|
||||
|
||||
public List<Presence> GenerateWeeklyPresence(int startLesson, int endLesson, int groupId, DateTime startDate)
|
||||
{
|
||||
var presences = new List<Presence>();
|
||||
|
||||
for (int i = 0; i < 7; i++)
|
||||
{
|
||||
DateTime currentDate = startDate.AddDays(i);
|
||||
var dailyPresences = GenerateDailyPresence(startLesson, endLesson, groupId, currentDate);
|
||||
presences.AddRange(dailyPresences);
|
||||
}
|
||||
return presences;
|
||||
}
|
||||
}
|
||||
}
|
62
Demo/Domain/UseCase/UseCasePresence.cs
Normal file
62
Demo/Domain/UseCase/UseCasePresence.cs
Normal file
@ -0,0 +1,62 @@
|
||||
using Demo.Data.LocalData;
|
||||
using Demo.domain.Models;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
|
||||
namespace Demo.Domain.UseCase
|
||||
{
|
||||
public class UseCasePresence
|
||||
{
|
||||
public List<PresenceLocalEntity> GetPresencesByGroupId(int groupId)
|
||||
{
|
||||
return LocalStaticData.presences
|
||||
.Where(p => LocalStaticData.users.Any(u => u.Guid == p.UserGuid && u.GroupID == groupId))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
public List<PresenceLocalEntity> GetPresencesByGroupIdAndDate(int groupId, DateOnly date)
|
||||
{
|
||||
return LocalStaticData.presences
|
||||
.Where(p => LocalStaticData.users.Any(u => u.Guid == p.UserGuid && u.GroupID == groupId)
|
||||
&& p.Date == date)
|
||||
.ToList();
|
||||
}
|
||||
public void MarkUserAsAbsent(Guid userGuid, int startLesson, int endLesson)
|
||||
{
|
||||
var presences = LocalStaticData.presences
|
||||
.Where(p => p.UserGuid == userGuid && p.LessonNumber >= startLesson && p.LessonNumber <= endLesson)
|
||||
.ToList();
|
||||
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
presence.IsAttedance = false;
|
||||
}
|
||||
}
|
||||
public void GenerateDailySchedule(int groupId, int startLesson, int endLesson)
|
||||
{
|
||||
var usersInGroup = LocalStaticData.users
|
||||
.Where(u => u.GroupID == groupId)
|
||||
.ToList();
|
||||
|
||||
Console.WriteLine($"Расписание для группы {groupId}:");
|
||||
|
||||
foreach (var user in usersInGroup)
|
||||
{
|
||||
for (int lesson = startLesson; lesson <= endLesson; lesson++)
|
||||
{
|
||||
var presence = new PresenceLocalEntity
|
||||
{
|
||||
UserGuid = user.Guid,
|
||||
IsAttedance = true,
|
||||
Date = DateOnly.FromDateTime(DateTime.Now),
|
||||
LessonNumber = lesson
|
||||
};
|
||||
|
||||
LocalStaticData.presences.Add(presence);
|
||||
|
||||
Console.WriteLine($"User: {user.Guid}, Attended: {presence.IsAttedance}, Date: {presence.Date}, Lesson: {presence.LessonNumber}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -10,7 +10,8 @@ class Program
|
||||
UserRepositoryImpl userRepositoryImpl = new UserRepositoryImpl();
|
||||
UserUseCase userUseCase = new UserUseCase(userRepositoryImpl, groupRepositoryImpl);
|
||||
GroupUseCase groupUseCase = new GroupUseCase(groupRepositoryImpl);
|
||||
UseCasePresence presenceUseCase = new UseCasePresence();
|
||||
|
||||
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase);
|
||||
MainMenuUI mainMenuUI = new MainMenuUI(userUseCase, groupUseCase, presenceUseCase);
|
||||
}
|
||||
}
|
||||
|
@ -5,16 +5,21 @@ using System;
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class MainMenuUI
|
||||
{
|
||||
private UserConsoleUI _userConsoleUI;
|
||||
private GroupConsoleUI _groupConsoleUI;
|
||||
{
|
||||
private UserConsoleUI _userConsoleUI;
|
||||
private GroupConsoleUI _groupConsoleUI;
|
||||
private UseCasePresence _presenceUseCase;
|
||||
private PresenceConsoleUI _presenceConsoleUI;
|
||||
|
||||
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase, UseCasePresence presenceUseCase)
|
||||
{
|
||||
_userConsoleUI = new UserConsoleUI(userUseCase);
|
||||
_groupConsoleUI = new GroupConsoleUI(groupUseCase);
|
||||
_presenceUseCase = presenceUseCase;
|
||||
_presenceConsoleUI = new PresenceConsoleUI(presenceUseCase);
|
||||
DisplayMenu();
|
||||
}
|
||||
|
||||
public MainMenuUI(UserUseCase userUseCase, GroupUseCase groupUseCase)
|
||||
{
|
||||
_userConsoleUI = new UserConsoleUI(userUseCase);
|
||||
_groupConsoleUI = new GroupConsoleUI(groupUseCase);
|
||||
DisplayMenu();
|
||||
}
|
||||
|
||||
private void DisplayMenu()
|
||||
{
|
||||
@ -29,6 +34,10 @@ namespace Demo.UI
|
||||
Console.WriteLine("6 - Добавить группу");
|
||||
Console.WriteLine("7 - Обновить группу по ID");
|
||||
Console.WriteLine("8 - Удалить группу по ID");
|
||||
Console.WriteLine("9 - Вывести посещаемость по группе");
|
||||
Console.WriteLine("10 - Вывести посещаемость по группе и дате");
|
||||
Console.WriteLine("11 - Отметить пользователя как отсутствующего");
|
||||
Console.WriteLine("12 - Генерация расписания по диапозону");
|
||||
Console.WriteLine("0 - Выход");
|
||||
|
||||
var input = Console.ReadLine();
|
||||
@ -108,6 +117,45 @@ namespace Demo.UI
|
||||
Console.WriteLine("Некорректный ID группы.");
|
||||
}
|
||||
break;
|
||||
case "9":
|
||||
Console.WriteLine("Введите ID группы для отображения посещаемости:");
|
||||
string inputGroupId = Console.ReadLine();
|
||||
if (int.TryParse(inputGroupId, out int parsedGroupId))
|
||||
{
|
||||
_presenceConsoleUI.DisplayPresencesByGroupId(parsedGroupId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный ID группы.");
|
||||
}
|
||||
break;
|
||||
case "10":
|
||||
Console.WriteLine("Введите ID группы для отображения посещаемости:");
|
||||
inputGroupId = Console.ReadLine();
|
||||
if (int.TryParse(inputGroupId, out parsedGroupId))
|
||||
{
|
||||
Console.WriteLine("Введите дату (yyyy-MM-dd):");
|
||||
string inputDate = Console.ReadLine();
|
||||
if (DateOnly.TryParse(inputDate, out DateOnly parsedDate))
|
||||
{
|
||||
_presenceConsoleUI.DisplayPresencesByGroupIdAndDate(parsedGroupId, parsedDate);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректная дата.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный ID группы.");
|
||||
}
|
||||
break;
|
||||
case "11":
|
||||
_presenceConsoleUI.MarkUserAsAbsent();
|
||||
break;
|
||||
case "12":
|
||||
_presenceConsoleUI.GenerateDailySchedule();
|
||||
break;
|
||||
case "0":
|
||||
return;
|
||||
default:
|
||||
|
102
Demo/UI/PresenceConcole.cs
Normal file
102
Demo/UI/PresenceConcole.cs
Normal file
@ -0,0 +1,102 @@
|
||||
using Demo.Domain.UseCase;
|
||||
using System;
|
||||
|
||||
namespace Demo.UI
|
||||
{
|
||||
public class PresenceConsoleUI
|
||||
{
|
||||
private UseCasePresence _useCasePresence;
|
||||
|
||||
public PresenceConsoleUI(UseCasePresence useCasePresence)
|
||||
{
|
||||
_useCasePresence = useCasePresence;
|
||||
}
|
||||
|
||||
public void DisplayPresencesByGroupId(int groupId)
|
||||
{
|
||||
var presences = _useCasePresence.GetPresencesByGroupId(groupId);
|
||||
Console.WriteLine($"Посещаемость для группы {groupId}:");
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
Console.WriteLine($"User: {presence.UserGuid}, Attended: {presence.IsAttedance}, Date: {presence.Date}, Lesson: {presence.LessonNumber}");
|
||||
}
|
||||
}
|
||||
public void DisplayPresencesByGroupIdAndDate(int groupId, DateOnly date)
|
||||
{
|
||||
var presences = _useCasePresence.GetPresencesByGroupId(groupId)
|
||||
.Where(p => p.Date == date)
|
||||
.ToList();
|
||||
|
||||
if (presences.Count == 0)
|
||||
{
|
||||
Console.WriteLine($"Посещаемость отсутствует для группы {groupId} на {date.ToShortDateString()}.");
|
||||
return;
|
||||
}
|
||||
|
||||
Console.WriteLine($"Посещаемость для группы {groupId} на {date.ToShortDateString()}:");
|
||||
foreach (var presence in presences)
|
||||
{
|
||||
Console.WriteLine($"User: {presence.UserGuid}, Attended: {presence.IsAttedance}, Lesson: {presence.LessonNumber}");
|
||||
}
|
||||
}
|
||||
public void MarkUserAsAbsent()
|
||||
{
|
||||
Console.WriteLine("Введите GUID пользователя:");
|
||||
if (Guid.TryParse(Console.ReadLine(), out var userGuid))
|
||||
{
|
||||
Console.WriteLine("Введите номер первого занятия:");
|
||||
if (int.TryParse(Console.ReadLine(), out int startLesson))
|
||||
{
|
||||
Console.WriteLine("Введите номер последнего занятия:");
|
||||
if (int.TryParse(Console.ReadLine(), out int endLesson))
|
||||
{
|
||||
_useCasePresence.MarkUserAsAbsent(userGuid, startLesson, endLesson);
|
||||
Console.WriteLine("Пользователь отмечен как отсутствующий.");
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный номер последнего занятия.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный номер первого занятия.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный GUID.");
|
||||
}
|
||||
}
|
||||
public void GenerateDailySchedule()
|
||||
{
|
||||
Console.WriteLine("Введите ID группы:");
|
||||
if (int.TryParse(Console.ReadLine(), out int groupId))
|
||||
{
|
||||
Console.WriteLine("Введите номер первого урока:");
|
||||
if (int.TryParse(Console.ReadLine(), out int startLesson))
|
||||
{
|
||||
Console.WriteLine("Введите номер последнего урока:");
|
||||
if (int.TryParse(Console.ReadLine(), out int endLesson))
|
||||
{
|
||||
_useCasePresence.GenerateDailySchedule(groupId, startLesson, endLesson);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный номер последнего урока.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный номер первого урока.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("Некорректный ID группы.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user