Skip to content

Commit

Permalink
Merge pull request #12 from mindbox-cloud/toporov/fixed-dictionary-in…
Browse files Browse the repository at this point in the history
…-issue

Fixed custom fields in issue
  • Loading branch information
Markeli authored Oct 31, 2024
2 parents 52e6f61 + ec250d2 commit ae240aa
Show file tree
Hide file tree
Showing 63 changed files with 901 additions and 582 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

/Mindbox.YandexTracker.Tests/appsettings.secret.json

# User-specific files
*.rsuser
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
</PropertyGroup>
<PropertyGroup>
<VersionMajor>1</VersionMajor>
<VersionMajor>2</VersionMajor>
<VersionMinor>0</VersionMinor>
<BuildNumber>$(BuildNumber)</BuildNumber>
<BuildNumber Condition="'$(BuildNumber)' == ''">0</BuildNumber>
Expand Down
2 changes: 1 addition & 1 deletion Mindbox.YandexTracker.Abstractions/Entities/Attachment.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public sealed record Attachment
/// <summary>
/// Адрес для скачивания превью
/// </summary>
public required string ThumbnailUrl { get; init; }
public string? ThumbnailUrl { get; init; }

/// <summary>
/// Создатель вложения.
Expand Down
48 changes: 47 additions & 1 deletion Mindbox.YandexTracker.Abstractions/Entities/Issue.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.Json;

[assembly: InternalsVisibleTo("Mindbox.YandexTracker")]

namespace Mindbox.YandexTracker;

Expand Down Expand Up @@ -137,5 +142,46 @@ public sealed record Issue
/// <summary>
/// Кастомные поля задачи
/// </summary>
public Dictionary<string, object?> CustomFields { get; init; } = [];
/// <remarks>
/// Используем JsonElement, потому что на этапе компиляции мы не знаем, какой объект придет к нам с сервера под
/// заданным ключиком. Чтобы не поломать работу было принято использовать JsonElement и ограничить доступ к словарю через
/// GetCustomField и SetCustomField.
/// </remarks>
internal Dictionary<string, JsonElement> CustomFields { get; init; } = [];

/// <remarks>
/// Необходимо передавать id кастомного поля, из-за того, что локальные поля очереди будут иметь префикс в своем
/// названии, которое будет совпадать с id
/// </remarks>
public T? GetCustomField<T>(string customFieldId)
{
ArgumentException.ThrowIfNullOrWhiteSpace(customFieldId);

if (CustomFields.TryGetValue(customFieldId, out var value))
{
return value.ValueKind is JsonValueKind.Null or JsonValueKind.Undefined
? default
: value.Deserialize<T?>();
}

throw new KeyNotFoundException($"Key '{customFieldId}' not found in custom fields.");
}

/// <remarks>
/// Необходимо передавать id кастомного поля, из-за того, что локальные поля очереди будут иметь префикс в своем
/// названии, которое будет совпадать с id
/// </remarks>
public void SetCustomField<T>(string customFieldId, T value)
{
ArgumentException.ThrowIfNullOrWhiteSpace(customFieldId);

CustomFields[customFieldId] = JsonSerializer.SerializeToElement(value);
}

public IReadOnlyList<string> GetCustomFieldsKeys()
{
return CustomFields
.Select(pair => pair.Key)
.ToList();
}
}
2 changes: 1 addition & 1 deletion Mindbox.YandexTracker.Abstractions/Entities/IssueField.cs
Original file line number Diff line number Diff line change
Expand Up @@ -92,5 +92,5 @@ public sealed record OptionsProviderInfo
/// <summary>
/// Массив со значениями поля
/// </summary>
public Collection<string> Values { get; init; } = [];
public Collection<object> Values { get; init; } = [];
}
9 changes: 2 additions & 7 deletions Mindbox.YandexTracker.Abstractions/Entities/IssueType.cs
Original file line number Diff line number Diff line change
@@ -1,34 +1,29 @@
using System.Runtime.Serialization;

namespace Mindbox.YandexTracker;

/// <summary>
/// Тип задачи
/// </summary>
[DataContract]
public sealed record IssueType
{
/// <summary>
/// Идентификатор типа
/// </summary>
[DataMember(Name = "id")]
public int Id { get; init; }

public int Version { get; init; }

/// <summary>
/// Ключ
/// </summary>
[DataMember(Name = "key")]
public required string Key { get; init; }

/// <summary>
/// Название
/// </summary>
[DataMember(Name = "name")]
public required string Name { get; init; }

/// <summary>
/// Описание
/// </summary>
[DataMember(Name = "description")]
public string Description { get; init; } = null!;
}
12 changes: 12 additions & 0 deletions Mindbox.YandexTracker.Abstractions/Entities/Project.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,11 +81,17 @@ public sealed record Project
/// <summary>
/// Дата начала
/// </summary>
/// <remarks>
/// Учитывается только год, месяц и день
/// </remarks>
public DateTime? StartUtc { get; init; }

/// <summary>
/// Дедлайн
/// </summary>
/// <remarks>
/// Учитывается только год, месяц и день
/// </remarks>
public DateTime? EndUtc { get; init; }

/// <summary>
Expand Down Expand Up @@ -113,6 +119,12 @@ public sealed record Project
/// </summary>
public int? ParentId { get; init; }

/// <summary>
/// Очереди задач, содержащихся в проекте
/// </summary>
/// <returns></returns>
public Collection<string>? IssueQueueKeys { get; init; }

public override int GetHashCode()
{
var hashCodePart1 = HashCode.Combine(
Expand Down
2 changes: 1 addition & 1 deletion Mindbox.YandexTracker.Abstractions/Entities/Queue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ public sealed record Queue
/// <summary>
/// Идентификатор очереди
/// </summary>
public string Id { get; init; } = null!;
public long Id { get; init; }

/// <summary>
/// Ключ очереди
Expand Down
37 changes: 12 additions & 25 deletions Mindbox.YandexTracker.Abstractions/Entities/UserDetailedInfo.cs
Original file line number Diff line number Diff line change
@@ -1,121 +1,108 @@
using System;
using System.Runtime.Serialization;

namespace Mindbox.YandexTracker;

/// <summary>
/// Детальная информация о пользователе
/// </summary>
[DataContract]
public sealed record UserDetailedInfo
{
/// <summary>
/// Уникальный идентификатор учетной записи пользователя в Tracker
/// </summary>
[DataMember(Name = "uid")]
public required string Id { get; init; }
public required long Id { get; init; }

/// <summary>
/// Логин пользователя
/// </summary>
[DataMember(Name = "login")]
public required string Login { get; init; }

/// <summary>
/// Уникальный идентификатор аккаунта пользователя в Tracker
/// </summary>
[DataMember(Name = "trackerUid")]
public required string TrackerUid { get; init; }
public required long TrackerUid { get; init; }

/// <summary>
/// Уникальный идентификатор аккаунта пользователя в организации Яндекс 360 для бизнеса и Яндекс ID
/// </summary>
[DataMember(Name = "passportUid")]
public required string PassportUid { get; init; }
/// <remarks>
/// Заполнен, если пользователь добавлен через Яндекс 360 для бизнеса или Яндекс ID.
/// </remarks>
public long? PassportUid { get; init; }

/// <summary>
/// Уникальный идентификатор пользователя в Yandex Cloud Organization
/// </summary>
[DataMember(Name = "cloudUid")]
public required string CloudUid { get; init; }
/// <remarks>
/// Заполнен, если пользователь добавлен через Yandex Cloud Organization.
/// </remarks>
public string? CloudUid { get; init; }

/// <summary>
/// Имя пользователя
/// </summary>
[DataMember(Name = "firstName")]
public required string FirstName { get; init; }

/// <summary>
/// Фамилия пользователя
/// </summary>
[DataMember(Name = "lastName")]
public required string LastName { get; init; }

/// <summary>
/// Отображаемое имя пользователя
/// </summary>
[DataMember(Name = "display")]
public required string Display { get; init; }

/// <summary>
/// Электронная почта пользователя
/// </summary>
[DataMember(Name = "email")]
public required string Email { get; init; }

/// <summary>
/// Служебный параметр
/// </summary>
[DataMember(Name = "external")]
public bool External { get; init; }

/// <summary>
/// Признак наличия у пользователя полного доступа к Tracker:
/// true — полный доступ;
/// false — только чтение
/// </summary>
[DataMember(Name = "hasLicense")]
public bool HasLicense { get; init; }

/// <summary>
/// Статус пользователя в организации:
/// true — пользователь удален из организации;
/// false — действующий сотрудник организации
/// </summary>
[DataMember(Name = "dismissed")]
public bool Dismissed { get; init; }

/// <summary>
/// Служебный параметр
/// </summary>
[DataMember(Name = "useNewFilters")]
public bool UseNewFilters { get; init; }

/// <summary>
/// Признак принудительного отключения уведомлений для пользователя:
/// true — уведомления отключены;
/// false — уведомления включены
/// </summary>
[DataMember(Name = "disableNotifications")]
public bool DisableNotifications { get; init; }

/// <summary>
/// Дата и время первой авторизации пользователя
/// </summary>
[DataMember(Name = "firstLoginDate")]
public DateTime FirstLoginDateUtc { get; init; }
public DateTime? FirstLoginDateUtc { get; init; }

/// <summary>
/// Дата и время последней авторизации пользователя
/// </summary>
[DataMember(Name = "lastLoginDate")]
public DateTime LastLoginDateUtc { get; init; }
public DateTime? LastLoginDateUtc { get; init; }

/// <summary>
/// Способ добавления пользователя:
/// true — с помощью приглашения на почту;
/// false — другим способом.
/// </summary>
[DataMember(Name = "welcomeMailSent")]
public bool WelcomeMailSent { get; init; }
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
using System.Runtime.Serialization;

namespace Mindbox.YandexTracker;

/// <summary>
/// Способ добавления комментария
/// </summary>
[DataContract]
public enum CommentTransportType
{
/// <summary>
/// Через интерфейс Tracker
/// </summary>
[EnumMember(Value = "internal")]
Internal,

/// <summary>
/// Через письмо
/// </summary>
[EnumMember(Value = "email")]
Email
}
6 changes: 0 additions & 6 deletions Mindbox.YandexTracker.Abstractions/Enums/CommentType.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,22 @@
using System.Runtime.Serialization;

namespace Mindbox.YandexTracker;

/// <summary>
/// Тип комментария
/// </summary>
[DataContract]
public enum CommentType
{
/// <summary>
/// Отправлен через интерфейс Tracker
/// </summary>
[EnumMember(Value = "standard")]
Standard,

/// <summary>
/// Создан из входящего письма
/// </summary>
[EnumMember(Value = "incoming")]
Incoming,

/// <summary>
/// Создан из исходящего письма
/// </summary>
[EnumMember(Value = "outcoming")]
Outcoming
}
8 changes: 0 additions & 8 deletions Mindbox.YandexTracker.Abstractions/Enums/IssueStatusType.cs
Original file line number Diff line number Diff line change
@@ -1,40 +1,32 @@
using System.Runtime.Serialization;

namespace Mindbox.YandexTracker;

/// <summary>
/// Тип статуса задачи
/// </summary>
[DataContract]
public enum IssueStatusType
{
/// <summary>
/// Начальный
/// </summary>
[EnumMember(Value = "new")]
New,

/// <summary>
/// На паузе
/// </summary>
[EnumMember(Value = "paused")]
Paused,

/// <summary>
/// В процессе
/// </summary>
[EnumMember(Value = "inProgress")]
InProgress,

/// <summary>
/// Завершен
/// </summary>
[EnumMember(Value = "done")]
Done,

/// <summary>
/// Отменен
/// </summary>
[EnumMember(Value = "cancelled")]
Cancelled
}
Loading

0 comments on commit ae240aa

Please sign in to comment.