Common tools

This commit is contained in:
kotcheshir73 2021-03-25 20:50:19 +04:00
parent ec174f4996
commit 4acf81d087
13 changed files with 392 additions and 0 deletions

View File

@ -0,0 +1,39 @@
using System;
namespace CommonTools.Attributes
{
/// <summary>
/// Описание зависимости сущности от другой сущности (требуется для сохранения и загрузки данных)
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class EntityDependencyAttribute : Attribute
{
/// <summary>
/// Название класса от котрого зависит этот класс
/// </summary>
public string ClassName { get; set; }
/// <summary>
/// Название поле в этом классе, которое ссылает на другой класс (идентификатор)
/// </summary>
public string ColumnName { get; set; }
/// <summary>
/// Описание зависимости
/// </summary>
public string Description { get; set; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="className">Название класса от котрого зависит этот класс</param>
/// <param name="columnName">Название поле в этом классе, которое ссылает на другой класс (идентификатор)</param>
/// <param name="description">Описание зависимости</param>
public EntityDependencyAttribute(string className, string columnName, string description)
{
ClassName = className;
ColumnName = columnName;
Description = description;
}
}
}

View File

@ -0,0 +1,32 @@
using System;
namespace CommonTools.Attributes
{
/// <summary>
/// Описание класса из базы данных, его назначение
/// </summary>
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class EntityDescriptionAttribute : Attribute
{
/// <summary>
/// Название сущности, которую описывает класс
/// </summary>
public string EntityName { get; set; }
/// <summary>
/// Описание назначения сущности
/// </summary>
public string Description { get; set; }
/// <summary>
/// Конструктор
/// </summary>
/// <param name="entityName">Название сущности, которую описывает класс</param>
/// <param name="description">Описание назначения сущности</param>
public EntityDescriptionAttribute(string entityName, string description)
{
EntityName = entityName;
Description = description;
}
}
}

View File

@ -0,0 +1,20 @@
using System;
namespace CommonTools.BindingModels
{
/// <summary>
/// Информация для доступа к выполнению операций
/// </summary>
public class AccessBindingModel
{
/// <summary>
/// Пропускать проверку (работает только для получения данных)
/// </summary>
public bool SkipCheck { get; set; }
/// <summary>
/// Идентификатор пользователя, который запрашивает выполнение операции
/// </summary>
public Guid? UserId { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
namespace CommonTools.BindingModels
{
/// <summary>
/// Получение записи по идентификатору
/// </summary>
public class GetBinidingModel : AccessBindingModel
{
/// <summary>
/// Идентификатор получаемой записи
/// </summary>
public Guid? Id { get; set; }
}
}

View File

@ -0,0 +1,23 @@
namespace CommonTools.BindingModels
{
/// <summary>
/// Пагинация для получения записей
/// </summary>
public class PageSettingBinidingModel : AccessBindingModel
{
/// <summary>
/// Номер страницы, которую получаем
/// </summary>
public int? PageNumber { get; set; }
/// <summary>
/// Количество записей возвращаемых
/// </summary>
public int? PageSize { get; set; }
/// <summary>
/// Иной признак, по которму отбираем записи
/// </summary>
public string PageName { get; set; }
}
}

View File

@ -0,0 +1,15 @@
using System;
namespace CommonTools.BindingModels
{
/// <summary>
/// Сохранение записи по идентификатору
/// </summary>
public class SetBinidingModel : AccessBindingModel
{
/// <summary>
/// Идентификатор записи
/// </summary>
public Guid Id { get; set; }
}
}

View File

@ -0,0 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
</PropertyGroup>
</Project>

View File

@ -0,0 +1,38 @@
namespace CommonTools.Enums
{
/// <summary>
/// Статус результата операции
/// </summary>
public enum ResultServiceStatusCode
{
/// <summary>
/// Успешно
/// </summary>
Success = 200,
/// <summary>
/// Ошибка общая
/// </summary>
Error = 400,
/// <summary>
/// Элемент уже сущствует
/// </summary>
ExsistItem = 401,
/// <summary>
/// Запись удалена
/// </summary>
WasDelete = 402,
/// <summary>
/// Не найдено
/// </summary>
NotFound = 404,
/// <summary>
/// Не найден файл
/// </summary>
FileNotFound = 405
}
}

View File

@ -0,0 +1,66 @@
using CommonTools.Enums;
using CommonTools.OperationResultModels;
using System;
namespace CommonTools.Extensions
{
/// <summary>
/// Расширения для результата операции
/// </summary>
public static class OperationResultExtensions
{
/// <summary>
/// Добавление простой ошибки
/// </summary>
/// <param name="model"></param>
/// <param name="key"></param>
/// <param name="value"></param>
public static void AddError(this OperationResultModel model, string key, string value) => model.AddError(key, value, ResultServiceStatusCode.Error);
/// <summary>
/// Добавление простой ошибки со сменой статуса
/// </summary>
/// <param name="model"></param>
/// <param name="key"></param>
/// <param name="error"></param>
/// <param name="statusCode"></param>
public static void AddError(this OperationResultModel model, string key, string error, ResultServiceStatusCode statusCode)
{
model.Errors.Add((key, error));
model.StatusCode = statusCode;
}
/// <summary>
/// Добавление ошибки
/// </summary>
/// <param name="model"></param>
/// <param name="error"></param>
public static void AddError(this OperationResultModel model, Exception error) => model.AddError(error, ResultServiceStatusCode.Error);
/// <summary>
/// Добавление ошибки
/// </summary>
/// <param name="model"></param>
/// <param name="error"></param>
/// <param name="statusCode"></param>
public static void AddError(this OperationResultModel model, Exception error, ResultServiceStatusCode statusCode) => model.AddError("Ошибка", error, statusCode);
/// <summary>
/// Добавление ошибки (включая вложеннные)
/// </summary>
/// <param name="model"></param>
/// <param name="key"></param>
/// <param name="error"></param>
/// <param name="statusCode"></param>
public static void AddError(this OperationResultModel model, string key, Exception error, ResultServiceStatusCode statusCode)
{
model.Errors.Add((key, error.Message));
while (error.InnerException != null)
{
error = error.InnerException;
model.Errors.Add(("Inner error:", error.Message));
}
model.StatusCode = statusCode;
}
}
}

View File

@ -0,0 +1,79 @@
using CommonTools.Enums;
using CommonTools.ViewModels;
using System.Collections.Generic;
namespace CommonTools.OperationResultModels
{
/// <summary>
/// Результат любой операции
/// </summary>
public class OperationResultModel
{
/// <summary>
/// Успешность операции (количество ошибок = 0)
/// </summary>
public bool IsSucceeded => Errors.Count == 0;
/// <summary>
/// Статус операции
/// </summary>
public ResultServiceStatusCode StatusCode { get; set; }
/// <summary>
/// Спсиок ошибок
/// </summary>
public List<(string Title, string Message)> Errors { get; private set; }
/// <summary>
/// Какой-то объект, получаемый по результатам операции (например, id)
/// </summary>
public object Result { get; private set; }
/// <summary>
/// Конструктор по умолчанию
/// </summary>
public OperationResultModel()
{
Errors = new List<(string Title, string Message)>();
StatusCode = ResultServiceStatusCode.Success;
}
}
/// <summary>
/// Результат любой операции
/// </summary>
/// <typeparam name="T"></typeparam>
public class OperationResultModel<T>
where T : ElementViewModel
{
/// <summary>
/// Успешность операции
/// </summary>
public bool IsSucceeded { get; private set; }
/// <summary>
/// Статус операции
/// </summary>
public ResultServiceStatusCode StatusCode { get; private set; }
/// <summary>
/// Спсиок ошибок
/// </summary>
public List<KeyValuePair<string, string>> Errors { get; private set; }
/// <summary>
/// Какой-то объект, получаемый по результатам операции (например, id)
/// </summary>
public T Result { get; private set; }
/// <summary>
/// Конструктор по умолчанию
/// </summary>
public OperationResultModel()
{
Errors = new List<KeyValuePair<string, string>>();
IsSucceeded = true;
StatusCode = 0;
}
}
}

View File

@ -0,0 +1,12 @@
using System;
namespace CommonTools.ViewModels
{
/// <summary>
/// Возвращаемая запись
/// </summary>
public class ElementViewModel
{
public Guid Id { get; set; }
}
}

View File

@ -0,0 +1,16 @@
using System.Collections.Generic;
namespace CommonTools.ViewModels
{
/// <summary>
/// Список возвращаемых значений
/// </summary>
/// <typeparam name="T"></typeparam>
public class ListViewModel<T>
where T : ElementViewModel
{
public int MaxCount { get; set; }
public List<T> List { get; set; }
}
}

View File

@ -0,0 +1,30 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.31112.23
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{6F154F8D-3437-45EE-9D89-02B96BDF3E8E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CommonTools", "Common\CommonTools\CommonTools.csproj", "{9E533D43-452A-40D6-852B-01E8391BBFF9}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9E533D43-452A-40D6-852B-01E8391BBFF9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9E533D43-452A-40D6-852B-01E8391BBFF9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9E533D43-452A-40D6-852B-01E8391BBFF9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9E533D43-452A-40D6-852B-01E8391BBFF9}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{9E533D43-452A-40D6-852B-01E8391BBFF9} = {6F154F8D-3437-45EE-9D89-02B96BDF3E8E}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FBA0CB49-EF2D-4538-9D00-FCEDA24879A9}
EndGlobalSection
EndGlobal