Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS has been phased out. To see alternatives please check here

Skip to content
Snippets Groups Projects
Commit 4520149e authored by Jelizaveta Zaharova's avatar Jelizaveta Zaharova
Browse files

Code cleanup and comments

parent 913d6c50
Branches
No related tags found
No related merge requests found
Showing
with 133 additions and 132 deletions
using System.ComponentModel.DataAnnotations;
namespace Tilde.MT.WebsiteTranslationService.Attributes
{
public class StringCollectionItemLengthAttribute : StringLengthAttribute
{
public StringCollectionItemLengthAttribute(int maximumLength) : base(maximumLength)
{
}
public override bool IsValid(object? value)
{
if (value is not IEnumerable<string>)
{
return false;
}
foreach (var item in value as IEnumerable<string>)
{
if (item.Length > MaximumLength || item.Length < MinimumLength)
{
return false;
}
}
return true;
}
}
}
using EnumsNET;
using Microsoft.AspNetCore.Mvc;
using System.Net;
using Tilde.MT.WebsiteTranslationService.Enums;
using Tilde.EMW.Contracts.Models.Common.Errors;
using Tilde.MT.WebsiteTranslationService.Enums;
namespace Tilde.MT.WebsiteTranslationService.Controllers
{
public class BaseController : ControllerBase
{
/// <summary>
/// Returns API error in the unified format, providing error code and message
/// </summary>
/// <param name="status"></param>
/// <param name="errorCode"></param>
/// <returns></returns>
protected ObjectResult FormatAPIError(HttpStatusCode status, ApiErrorCode errorCode)
{
return StatusCode(
......
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using System.Net;
......@@ -7,7 +6,6 @@ using Tilde.MT.WebsiteTranslationService.Models.DTO.Page;
namespace Tilde.MT.WebsiteTranslationService.Controllers
{
///
[ApiController]
[Route("translate/website/{websiteId}/pages")]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
......@@ -15,7 +13,6 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
{
private readonly IPageService _pageService;
///
public PageController(
ILogger<SegmentController> logger,
IPageService pageService
......@@ -25,8 +22,10 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// List all pages
/// List all pages for a website
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="filters"> Filters for paages </param>
/// <returns></returns>
[Route("")]
[HttpGet]
......
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using System.ComponentModel.DataAnnotations;
using System.Net;
using Tilde.EMW.Contracts.Models.Common.Errors;
using Tilde.MT.WebsiteTranslationService.Enums;
using Tilde.MT.WebsiteTranslationService.Exceptions;
using Tilde.MT.WebsiteTranslationService.Exceptions.Translation;
using Tilde.MT.WebsiteTranslationService.Interfaces.Services;
using Tilde.MT.WebsiteTranslationService.Models.DTO;
using Tilde.EMW.Contracts.Models.Common.Errors;
using Tilde.MT.WebsiteTranslationService.Models.DTO.Translation;
namespace Tilde.MT.WebsiteTranslationService.Controllers
{
///
[ApiController]
[Route("translate/website/{websiteId}/segments")]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
......@@ -21,8 +19,6 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
{
private readonly ILogger<SegmentController> _logger;
private readonly ISegmentService _suggestionService;
///
public SegmentController(
ILogger<SegmentController> logger,
ISegmentService suggestionService
......@@ -33,8 +29,10 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// List all segments
/// List all segments for a website
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="filters"> Filters for segments </param>
/// <returns></returns>
[Route("")]
[HttpGet]
......@@ -47,8 +45,10 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// Delete segment
/// Delete website segment
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <returns></returns>
[Route("{segmentId}")]
[HttpDelete]
......@@ -68,9 +68,14 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
return FormatAPIError(HttpStatusCode.NotFound, Enums.ApiErrorCode.ResourceNotFound);
}
}
/// <summary>
/// Add new translation
/// Add new translation for a website
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <param name="lang"> Target language </param>
/// <param name="suggestion"> New translation suggestion </param>
/// <returns></returns>
[Route("{segmentId}/{lang}")]
[HttpPost]
......@@ -103,8 +108,11 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// Get all translations for segment
/// Get all translations for a website segment
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <param name="lang"> Target language </param>
/// <returns></returns>
[Route("{segmentId}/{lang}")]
[HttpGet]
......@@ -121,8 +129,12 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// Accept translation
/// Accept translation for a website segment
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <param name="lang"> Target language </param>
/// <param name="translId"> Translation unique identifier </param>
/// <returns></returns>
[Route("{segmentId}/{lang}/translation/{translId}")]
[HttpPut]
......@@ -148,8 +160,12 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// Delete Translation
/// Delete translation from a website segment
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <param name="lang"> Target language </param>
/// <param name="translId"> Translation unique identifier </param>
/// <returns></returns>
[Route("{segmentId}/{lang}/{translId}")]
[HttpDelete]
......
......@@ -2,15 +2,14 @@
using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.Annotations;
using System.Net;
using Tilde.EMW.Contracts.Exceptions.TranslationSystem;
using Tilde.EMW.Contracts.Models.Common.Errors;
using Tilde.MT.WebsiteTranslationService.Exceptions;
using Tilde.MT.WebsiteTranslationService.Exceptions.Domain;
using Tilde.MT.WebsiteTranslationService.Interfaces.Services;
using Tilde.EMW.Contracts.Exceptions.TranslationSystem;
using Tilde.EMW.Contracts.Models.Common.Errors;
namespace Tilde.MT.WebsiteTranslationService.Controllers
{
///
[ApiController]
[Route("translate/website/{websiteId}/translate")]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
......@@ -19,7 +18,6 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
private readonly ILogger _logger;
private readonly ITranslationService _textService;
///
public TranslationController(
ILogger<TranslationController> logger,
ITranslationService textService
......@@ -30,8 +28,10 @@ namespace Tilde.MT.WebsiteTranslationService.Controllers
}
/// <summary>
/// Get segment translation
/// Get website segment translation
/// </summary>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="request"> Segment request </param>
/// <returns></returns>
[Route("")]
[HttpPost]
......
......@@ -2,6 +2,9 @@
namespace Tilde.MT.WebsiteTranslationService.Enums
{
/// <summary>
/// API error code, used for returning API error in the unified format, providing error code and message
/// </summary>
public enum ApiErrorCode
{
[Description("Resource not found")]
......
namespace Tilde.MT.WebsiteTranslationService.Enums
{
/// <summary>
/// Authentication scheme
/// </summary>
public static class AuthenticationScheme
{
public const string KeyCloak = "keycloak";
......
......@@ -2,6 +2,9 @@
{
public class DomainNotAllowedException : Exception
{
/// <summary>
/// Domain is not allowed
/// </summary>
public DomainNotAllowedException(Guid websiteId, Uri? referer) : base($"Domain '{referer?.DnsSafeHost}' not allowed for website '{websiteId}'")
{
......
......@@ -2,6 +2,9 @@
{
public class AcceptedTranslationDeleteNotAllowedException : Exception
{
/// <summary>
/// Deleting accepted translation is not allowed
/// </summary>
public AcceptedTranslationDeleteNotAllowedException() : base()
{
......
......@@ -2,6 +2,9 @@
{
public class InvalidTranslationException : Exception
{
/// <summary>
/// Translation is not valid
/// </summary>
public InvalidTranslationException() : base("Translation is not valid")
{
......
......@@ -2,6 +2,9 @@
{
public class WebsiteNotFoundException : Exception
{
/// <summary>
/// Website is not found
/// </summary>
public WebsiteNotFoundException(Guid websiteId) : base($"Website '{websiteId}' not found")
{
}
......
......@@ -4,6 +4,11 @@
{
private static readonly string DevelopmentCorsPolicy = "development-policy";
/// <summary>
/// Add cors policies
/// </summary>
/// <param name="services"> Service collection </param>
/// <returns></returns>
public static IServiceCollection AddCorsPolicies(this IServiceCollection services)
{
services.AddCors(options =>
......@@ -20,6 +25,11 @@
return services;
}
/// <summary>
/// Use cors policies
/// </summary>
/// <param name="app"> Application builder </param>
/// <returns></returns>
public static IApplicationBuilder UseCorsPolicies(this IApplicationBuilder app)
{
app.UseCors(DevelopmentCorsPolicy);
......
......@@ -5,6 +5,12 @@ namespace Tilde.MT.WebsiteTranslationService.Extensions
{
public static class DocumentationExtensions
{
/// <summary>
/// Add swagger documentation
/// </summary>
/// <param name="services"> Service collection </param>
/// <param name="configuration"> Configuration settings </param>
/// <returns></returns>
public static IServiceCollection AddDocumentation(this IServiceCollection services, ConfigurationSettings configuration)
{
services.AddSwaggerGen(c =>
......@@ -24,6 +30,13 @@ namespace Tilde.MT.WebsiteTranslationService.Extensions
return services;
}
/// <summary>
/// Use documentation
/// </summary>
/// <param name="app"> Application builder </param>
/// <param name="configuration"> Configuration settings </param>
/// <returns></returns>
public static IApplicationBuilder UseDocumentation(this IApplicationBuilder app, ConfigurationSettings configuration)
{
app.UseSwagger();
......
using Microsoft.EntityFrameworkCore.Diagnostics;
using System.Data.Common;
namespace Tilde.MT.WebsiteTranslationService.Interceptors
{
public class DatabaseLongQueryLogger : DbCommandInterceptor
{
private readonly ILogger _logger;
public DatabaseLongQueryLogger(ILoggerFactory loggerFactory)
{
_logger = loggerFactory.CreateLogger(nameof(DatabaseLongQueryLogger));
}
public override ValueTask<DbDataReader> ReaderExecutedAsync(DbCommand command, CommandExecutedEventData eventData, DbDataReader result, CancellationToken cancellationToken = default)
{
if (eventData.Duration.TotalMilliseconds > 200)
{
LogLongQuery(command, eventData);
}
return base.ReaderExecutedAsync(command, eventData, result, cancellationToken);
}
private void LogLongQuery(DbCommand command, CommandExecutedEventData eventData)
{
_logger.LogWarning($"Long query:{command.CommandText}. TotalMilliseconds:{eventData.Duration}");
}
public override DbDataReader ReaderExecuted(DbCommand command, CommandExecutedEventData eventData, DbDataReader result)
{
if (eventData.Duration.TotalMilliseconds > 5000)
{
LogLongQuery(command, eventData);
}
return base.ReaderExecuted(command, eventData, result);
}
}
}
namespace Tilde.MT.WebsiteTranslationService.Interfaces.Database
{
///
/// <summary>
/// Interface for entity timestamps
/// </summary>
public interface IEntityTimestamps
{
/// <summary>
/// Timestamp when entity is created in DB
/// Timestamp when entity is created in database
/// </summary>
DateTime? DbCreatedAt { get; set; }
/// <summary>
/// Timestamp when entity is updated in DB
/// Timestamp when entity is updated in database
/// </summary>
DateTime? DbUpdatedAt { get; set; }
}
......
......@@ -5,8 +5,9 @@ namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
public interface IConfigurationService
{
/// <summary>
/// Get configuration
/// Get configuration by unique identifier
/// </summary>
/// <param name="id"> Configuration unique identifier </param>
/// <returns></returns>
public Task<Configuration> Get(Guid id);
}
......
namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
using Tilde.EMW.Contracts.Exceptions.TranslationSystem;
namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
{
///
public interface IMachineTranslationService
{
/// <summary>
/// Translate text with Machine Translation
/// </summary>
/// <param name="sourceLanguage"></param>
/// <param name="targetLanguage"></param>
/// <param name="domain"></param>
/// <param name="text"></param>
/// <param name="sourceLanguage"> Source language </param>
/// <param name="targetLanguage"> Target language </param>
/// <param name="domain"> Domain name </param>
/// <param name="text"> Texts to translate </param>
/// <returns></returns>
/// <exception cref="LanguageDirectionNotFoundException"></exception>
/// <exception cref="TranslationTimeoutException"></exception>
public Task<IEnumerable<string>> Translate(string sourceLanguage, string targetLanguage, string domain, IEnumerable<string> text);
}
}
......@@ -8,9 +8,9 @@ namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
/// <summary>
/// List available pages for website
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="filters"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="filters"> Filters for pages </param>
/// <returns></returns>
Task<PageList> ListPages(ClaimsPrincipal user, Guid websiteId, Models.DTO.Page.PageListFilter filters);
}
......
......@@ -6,58 +6,59 @@ using Tilde.MT.WebsiteTranslationService.Models.DTO.Translation;
namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
{
///
public interface ISegmentService
{
/// <summary>
/// List all segments
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="filters"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="filters"> Filters for segments </param>
/// <returns></returns>
public Task<SegmentList> ListSegments(ClaimsPrincipal user, Guid websiteId, SegmentListFilter filters);
/// <summary>
/// List all translations
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="segmentId"></param>
/// <param name="targetLanguage"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <param name="targetLanguage"> Target language </param>
/// <returns></returns>
public Task<IEnumerable<Translation>> ListTranslations(ClaimsPrincipal user, Guid websiteId, long segmentId, string targetLanguage);
/// <summary>
/// Delete segment
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="segmentId"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="segmentId"> Segment unique identifier </param>
/// <returns></returns>
/// <exception cref="ResourceNotFoundException"></exception>
public Task DeleteSegment(ClaimsPrincipal user, Guid websiteId, long segmentId);
/// <summary>
/// Add translation
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="sourceSegmentId"></param>
/// <param name="targetLanguage"></param>
/// <param name="suggestion"></param>
/// <param name="uri"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="sourceSegmentId"> Source segment unique identifier </param>
/// <param name="targetLanguage"> Target language </param>
/// <param name="suggestion"> New text suggestion </param>
/// <param name="uri"> URI </param>
/// <returns></returns>
/// <exception cref="ResourceNotFoundException"></exception>
/// <exception cref="InvalidTranslationException"></exception>
public Task<Translation> Add(ClaimsPrincipal user, Guid websiteId, long sourceSegmentId, string targetLanguage, string suggestion, string uri);
/// <summary>
/// Make translation as accepted
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="lang"></param>
/// <param name="sourceSegmentId"></param>
/// <param name="suggestionId"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="lang"> Target language </param>
/// <param name="sourceSegmentId"> Source segment unique identifier </param>
/// <param name="suggestionId"> Suggestion unique identifier </param>
/// <returns></returns>
/// <exception cref="ResourceNotFoundException"></exception>
public Task Accept(ClaimsPrincipal user, Guid websiteId, string lang, long sourceSegmentId, long suggestionId);
......@@ -65,11 +66,11 @@ namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
/// <summary>
/// Remove translation
/// </summary>
/// <param name="user"></param>
/// <param name="websiteId"></param>
/// <param name="sourceSegmentId"></param>
/// <param name="language"></param>
/// <param name="suggestionId"></param>
/// <param name="user"> User associated with the executing action </param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="sourceSegmentId"> Source segment unique identifier </param>
/// <param name="language"> Target language </param>
/// <param name="suggestionId"> Suggestion unique identifier </param>
/// <returns></returns>
/// <exception cref="ResourceNotFoundException"></exception>
/// <exception cref="AcceptedTranslationDeleteNotAllowedException"></exception>
......
......@@ -3,15 +3,14 @@ using Tilde.MT.WebsiteTranslationService.Exceptions.Domain;
namespace Tilde.MT.WebsiteTranslationService.Interfaces.Services
{
///
public interface ITranslationService
{
/// <summary>
/// Translate text
/// </summary>
/// <param name="websiteId"></param>
/// <param name="request"></param>
/// <param name="referer"></param>
/// <param name="websiteId"> Website unique identifier </param>
/// <param name="request"> Segment request </param>
/// <param name="referer"> Referer header of the HTTP request </param>
/// <returns></returns>
/// <exception cref="DomainNotAllowedException"></exception>
/// <exception cref="ResourceNotFoundException"></exception>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment