diff --git a/.github/workflows/update-iteration.yml b/.github/workflows/update-iteration.yml
index 2d38d0afb..d6b926b7d 100644
--- a/.github/workflows/update-iteration.yml
+++ b/.github/workflows/update-iteration.yml
@@ -2,8 +2,8 @@ name: Move Tasks To New Iteration
on:
schedule:
- # Runs "at 05:00 GMT+2, only on Thursday"
- - cron: '0 3 * * 4'
+ # Runs "at 05:00 GMT+2, everyday"
+ - cron: '0 3 * * *'
jobs:
move-to-next-iteration:
diff --git a/Dockerfile.dbupdate b/Dockerfile.dbupdate
new file mode 100644
index 000000000..8b501d6e3
--- /dev/null
+++ b/Dockerfile.dbupdate
@@ -0,0 +1,26 @@
+FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
+WORKDIR /app
+
+# copy dependencies
+COPY ./Streetcode/DbUpdate/DbUpdate.csproj ./DbUpdate/
+COPY ./Streetcode/DbUpdate/*.cs ./DbUpdate/
+COPY ./Streetcode/DbUpdate/appsettings.Local.json ./DbUpdate/
+COPY ./Streetcode/DbUpdate/appsettings.IntegrationTests.json ./DbUpdate/
+COPY ./Streetcode ./Streetcode/
+COPY ./Streetcode/Streetcode.DAL/Persistence/ScriptsMigration ./Streetcode.DAL/Persistence/ScriptsMigration/
+
+RUN dotnet restore ./DbUpdate/DbUpdate.csproj
+
+
+# build
+RUN dotnet build ./DbUpdate/DbUpdate.csproj -c Release -o /app/build
+
+# publishishing application
+FROM build AS publish
+RUN dotnet publish ./DbUpdate/DbUpdate.csproj -c Release -o /app/publish
+
+FROM mcr.microsoft.com/dotnet/runtime:7.0 AS runtime
+WORKDIR /app
+COPY --from=publish /app/publish .
+
+CMD ["dotnet", "DbUpdate.dll"]
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index d54602026..f98fba86b 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -1,6 +1,8 @@
def CODE_VERSION = ''
def IS_IMAGE_BUILDED = false
+def IS_DBUPDATE_IMAGE_BUILDED = false
def IS_IMAGE_PUSH = false
+def IS_DBUPDATE_IMAGE_PUSH = false
def isSuccess
def preDeployFrontStage
def preDeployBackStage
@@ -45,9 +47,14 @@ pipeline {
stage('Setup dependencies') {
steps {
script {
- sh 'dotnet tool update --global dotnet-coverage'
+ sh 'rm -rf ~/.dotnet/tools/dotnet-coverage || true'
+ sh 'rm -rf ~/.dotnet/tools/dotnet-sonarscanner || true'
+ sh 'rm -rf ~/.dotnet/tools/GitVersion.Tool || true'
+
+ sh 'dotnet tool update --global dotnet-coverage --version 17.13.1'
sh 'dotnet tool update --global dotnet-sonarscanner'
sh 'dotnet tool update --global GitVersion.Tool --version 5.12.0'
+
sh 'docker image prune --force --all --filter "until=72h"'
sh 'docker system prune --force --all --filter "until=72h"'
@@ -84,10 +91,10 @@ pipeline {
steps {
parallel(
Unit_test: {
- sh 'dotnet test ./Streetcode/Streetcode.XUnitTest/Streetcode.XUnitTest.csproj --configuration Release'
+ sh 'dotnet test ./Streetcode/Streetcode.XUnitTest/Streetcode.XUnitTest.csproj --configuration Release --no-build'
},
Integration_test: {
- sh 'dotnet test ./Streetcode/Streetcode.XIntegrationTest/Streetcode.XIntegrationTest.csproj --configuration Release'
+ sh 'dotnet test ./Streetcode/Streetcode.XIntegrationTest/Streetcode.XIntegrationTest.csproj --configuration Release --no-build'
}
)
}
@@ -116,8 +123,8 @@ pipeline {
/d:sonar.pullrequest.branch=$PR_BRANCH \
/d:sonar.pullrequest.base=$PR_BASE
- dotnet build ./Streetcode/Streetcode.sln --configuration Release
- dotnet-coverage collect "dotnet test ./Streetcode/Streetcode.sln --configuration Release" -f xml -o "coverage.xml"
+ dotnet build ./Streetcode/Streetcode.sln --configuration Release -p:WarningLevel=0
+ dotnet-coverage collect "dotnet test ./Streetcode/Streetcode.sln --configuration Release --no-build" -f xml -o "coverage.xml"
dotnet sonarscanner end /d:sonar.token=$SONAR
'''
} else {
@@ -129,8 +136,8 @@ pipeline {
/d:sonar.host.url="https://sonarcloud.io" \
/d:sonar.cs.vscoveragexml.reportsPaths="**/coverage.xml" \
- dotnet build ./Streetcode/Streetcode.sln --configuration Release
- dotnet-coverage collect "dotnet test ./Streetcode/Streetcode.sln --configuration Release" -f xml -o "coverage.xml"
+ dotnet build ./Streetcode/Streetcode.sln --configuration Release -p:WarningLevel=0
+ dotnet-coverage collect "dotnet test ./Streetcode/Streetcode.sln --configuration Release --no-build" -f xml -o "coverage.xml"
dotnet sonarscanner end /d:sonar.token=$SONAR
'''
}
@@ -138,7 +145,7 @@ pipeline {
}
}
}
- stage('Build image') {
+ stage('Build images') {
when {
branch pattern: "release/[0-9].[0-9].[0-9]", comparator: "REGEXP"
@@ -146,38 +153,45 @@ pipeline {
steps {
script {
withCredentials([usernamePassword(credentialsId: 'docker-login-streetcode', passwordVariable: 'password', usernameVariable: 'username')]){
- sh "docker build -t ${username}/streetcode:latest ."
+ // Build the backend image
+ sh "docker build -f Dockerfile -t ${username}/streetcode:${env.CODE_VERSION} ."
IS_IMAGE_BUILDED = true
+
+ // Build the dbupdate image
+ sh "docker build -f Dockerfile.dbupdate -t ${username}/dbupdate:${env.CODE_VERSION} ."
+ IS_DBUPDATE_IMAGE_BUILDED = true
}
}
}
}
- stage('Push image') {
+ stage('Push images') {
when {
- expression { IS_IMAGE_BUILDED == true }
+ expression { IS_IMAGE_BUILDED == true && IS_DBUPDATE_IMAGE_BUILDED == true }
}
steps {
script {
withCredentials([usernamePassword(credentialsId: 'docker-login-streetcode', passwordVariable: 'password', usernameVariable: 'username')]){
sh 'echo "${password}" | docker login -u "${username}" --password-stdin'
- sh "docker push ${username}/streetcode:latest"
- sh "docker tag ${username}/streetcode:latest ${username}/streetcode:${env.CODE_VERSION}"
+
sh "docker push ${username}/streetcode:${env.CODE_VERSION}"
IS_IMAGE_PUSH = true
-
+
+ sh "docker push ${username}/dbupdate:${env.CODE_VERSION}"
+ IS_DBUPDATE_IMAGE_PUSH = true
+
}
}
}
}
stage('Deploy Stage'){
when {
- expression { IS_IMAGE_PUSH == true }
+ expression { IS_IMAGE_PUSH == true && IS_DBUPDATE_IMAGE_PUSH == true }
}
steps {
input message: 'Do you want to approve Staging deployment?', ok: 'Yes', submitter: 'admin_1, ira_zavushchak , dev'
script {
checkout scmGit(
- branches: [[name: 'main']],
+ branches: [[name: 'feature/add-init-container']],
userRemoteConfigs: [[credentialsId: 'StreetcodeGithubCreds', url: 'git@github.com:ita-social-projects/Streetcode-DevOps.git']])
preDeployBackStage = sh(script: 'docker container inspect $(docker container ls -aq) --format "{{.Config.Image}}" | grep "streetcodeua/streetcode:" | perl -pe \'($_)=/([0-9]+([.][0-9]+)+)/\'', returnStdout: true).trim()
@@ -195,7 +209,7 @@ pipeline {
sh 'docker system prune --force --filter "until=72h"'
sh """ export DOCKER_TAG_BACKEND=${env.CODE_VERSION}
export DOCKER_TAG_FRONTEND=${preDeployFrontStage}
- docker stop backend frontend nginx loki certbot
+ docker stop backend frontend nginx loki certbot dbupdate
docker container prune -f
docker volume prune -f
docker network prune -f
@@ -207,7 +221,7 @@ pipeline {
}
stage('WHAT IS THE NEXT STEP') {
when {
- expression { IS_IMAGE_PUSH == true }
+ expression { IS_IMAGE_PUSH == true && IS_DBUPDATE_IMAGE_PUSH == true }
}
steps {
script {
@@ -228,7 +242,7 @@ pipeline {
sh """
export DOCKER_TAG_BACKEND=${preDeployBackStage}
export DOCKER_TAG_FRONTEND=${preDeployFrontStage}
- docker stop backend frontend nginx loki certbot
+ docker stop backend frontend nginx loki certbot dbupdate
docker container prune -f
docker volume prune -f
docker network prune -f
@@ -245,7 +259,9 @@ pipeline {
}
}
}
+
/*
+
stage('Deploy prod') {
agent {
label 'production'
@@ -286,7 +302,9 @@ pipeline {
}
}
}
+
*/
+
stage('Sync after release') {
when {
expression { isSuccess == '1' }
@@ -340,7 +358,9 @@ pipeline {
}
}
}
+
*/
+
}
post {
always {
@@ -349,3 +369,4 @@ post {
}
}
}
+
diff --git a/Streetcode/DbUpdate/DbUpdate.csproj b/Streetcode/DbUpdate/DbUpdate.csproj
index 6d6674574..f1a1b2efc 100644
--- a/Streetcode/DbUpdate/DbUpdate.csproj
+++ b/Streetcode/DbUpdate/DbUpdate.csproj
@@ -11,7 +11,11 @@
+
+
+
+
@@ -21,11 +25,27 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ PreserveNewest
+
+
+
+ PreserveNewest
+
-
+
+
+
+
+
+
true
diff --git a/Streetcode/DbUpdate/Program.cs b/Streetcode/DbUpdate/Program.cs
index 92d226671..cde0cd386 100644
--- a/Streetcode/DbUpdate/Program.cs
+++ b/Streetcode/DbUpdate/Program.cs
@@ -1,4 +1,5 @@
-using DbUp;
+using System.Reflection;
+using DbUp;
using Microsoft.Extensions.Configuration;
public class Program
@@ -8,22 +9,20 @@ static int Main(string[] args)
string rootDirectory = GetRootFolderPath();
string pathToSqlScripts = Path.Combine(
rootDirectory,
- "Streetcode",
- "Streetcode.DAL",
- "Persistence",
"ScriptsMigration");
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Local";
var configuration = new ConfigurationBuilder()
- .SetBasePath(Path.Combine(rootDirectory, "Streetcode", "Streetcode.WebApi"))
- .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
+ .SetBasePath(rootDirectory)
+ .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables("STREETCODE_")
.Build();
var connectionString = configuration.GetConnectionString("DefaultConnection");
+ Console.WriteLine($"Connection string: {connectionString}");
var upgrader =
DeployChanges.To
.SqlDatabase(connectionString)
@@ -50,16 +49,16 @@ static int Main(string[] args)
return 0;
}
- private static string GetRootFolderPath()
- {
- // By root folder we mean folder, that contains .gitignore file.
- string currentDirectoryPath = Directory.GetCurrentDirectory();
- var directory = new DirectoryInfo(currentDirectoryPath);
- while (directory is not null && !directory.GetFiles(".gitignore").Any())
- {
- directory = directory.Parent;
- }
-
- return directory?.FullName ?? throw new NullReferenceException("Cannot find root folder");
+ private static string GetRootFolderPath()
+ {
+ string codeBase = Assembly.GetExecutingAssembly().CodeBase;
+ if (codeBase == null)
+ {
+ throw new NullReferenceException("Cannot find root folder");
+ }
+
+ UriBuilder uri = new UriBuilder(codeBase);
+ string path = Uri.UnescapeDataString(uri.Path);
+ return Path.GetDirectoryName(path) !;
}
}
\ No newline at end of file
diff --git a/Streetcode/DbUpdate/appsettings.IntegrationTests.json b/Streetcode/DbUpdate/appsettings.IntegrationTests.json
new file mode 100644
index 000000000..f827a5951
--- /dev/null
+++ b/Streetcode/DbUpdate/appsettings.IntegrationTests.json
@@ -0,0 +1,5 @@
+{
+ "ConnectionStrings": {
+ "DefaultConnection": "Server=localhost,1455;Database=Streetcode_IntegrationTests_Db;User Id=sa;Password=sdlLKMCD234!@#lkcmds;MultipleActiveResultSets=True;TrustServerCertificate=true"
+ }
+}
\ No newline at end of file
diff --git a/Streetcode/DbUpdate/appsettings.Local.json b/Streetcode/DbUpdate/appsettings.Local.json
new file mode 100644
index 000000000..bd35fe812
--- /dev/null
+++ b/Streetcode/DbUpdate/appsettings.Local.json
@@ -0,0 +1,5 @@
+{
+ "ConnectionStrings": {
+ "DefaultConnection": "Server=localhost, 1433;Database=test-db;User Id=sa;Password=Admin@1234;MultipleActiveResultSets=true;TrustServerCertificate=true"
+ }
+}
diff --git a/Streetcode/Streetcode.BLL/Attributes/Authentication/ValidEmailAttribute.cs b/Streetcode/Streetcode.BLL/Attributes/Authentication/ValidEmailAttribute.cs
index e34ae6ef0..7f831886d 100644
--- a/Streetcode/Streetcode.BLL/Attributes/Authentication/ValidEmailAttribute.cs
+++ b/Streetcode/Streetcode.BLL/Attributes/Authentication/ValidEmailAttribute.cs
@@ -3,6 +3,7 @@
namespace Streetcode.BLL.Attributes.Authentication
{
+ [AttributeUsage(AttributeTargets.Property)]
public class ValidEmailAttribute : ValidationAttribute
{
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
@@ -19,7 +20,7 @@ public class ValidEmailAttribute : ValidationAttribute
return new ValidationResult("Attribute cannot be applied to non-string property");
}
- if (!Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.(com|net|org|gov|ua)$", RegexOptions.None, TimeSpan.FromMilliseconds(100)))
+ if (!Regex.IsMatch(email, @"^(?!.*\.\.)[a-zA-Z0-9_%+-]+(?:\.[a-zA-Z0-9_%+-]+)*@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$", RegexOptions.None, TimeSpan.FromMilliseconds(100)))
{
return new ValidationResult("Incorrect email address format");
}
diff --git a/Streetcode/Streetcode.BLL/DTO/Authentication/GoogleLogin/GoogleLoginRequest.cs b/Streetcode/Streetcode.BLL/DTO/Authentication/GoogleLogin/GoogleLoginRequest.cs
new file mode 100644
index 000000000..c7dae6603
--- /dev/null
+++ b/Streetcode/Streetcode.BLL/DTO/Authentication/GoogleLogin/GoogleLoginRequest.cs
@@ -0,0 +1,7 @@
+namespace Streetcode.BLL.DTO.Authentication.GoogleLogin
+{
+ public class GoogleLoginRequest
+ {
+ public string IdToken { get; set; } = string.Empty;
+ }
+}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/DTO/Authentication/Login/LoginRequestDTO.cs b/Streetcode/Streetcode.BLL/DTO/Authentication/Login/LoginRequestDTO.cs
index 987708121..27878c9b3 100644
--- a/Streetcode/Streetcode.BLL/DTO/Authentication/Login/LoginRequestDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Authentication/Login/LoginRequestDTO.cs
@@ -1,13 +1,14 @@
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using Streetcode.BLL.Constants.Authentication;
+using Streetcode.BLL.Attributes.Authentication;
namespace Streetcode.BLL.DTO.Authentication.Login;
public class LoginRequestDTO
{
[Required]
- [EmailAddress]
+ [ValidEmail]
[DefaultValue(AuthConstants.Email)]
public string Login { get; set; } = null!;
diff --git a/Streetcode/Streetcode.BLL/DTO/Authentication/Register/RegisterRequestDTO.cs b/Streetcode/Streetcode.BLL/DTO/Authentication/Register/RegisterRequestDTO.cs
index edc2e8129..ea3d22343 100644
--- a/Streetcode/Streetcode.BLL/DTO/Authentication/Register/RegisterRequestDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Authentication/Register/RegisterRequestDTO.cs
@@ -1,7 +1,5 @@
-using System.ComponentModel;
-using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations;
using Streetcode.BLL.Attributes.Authentication;
-using Streetcode.BLL.Constants.Authentication;
namespace Streetcode.BLL.DTO.Authentication.Register;
@@ -9,30 +7,24 @@ public class RegisterRequestDTO
{
[Required]
[MaxLength(50)]
- [DefaultValue(AuthConstants.Name)]
public string Name { get; set; } = null!;
[Required]
[MaxLength(50)]
- [DefaultValue(AuthConstants.Surname)]
public string Surname { get; set; } = null!;
[Required]
- [EmailAddress]
- [DefaultValue(AuthConstants.Email)]
- [RegularExpression(@"[^\.\-_](?:[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])", ErrorMessage = "The Email field doesn't contain a valid email address")]
+ [ValidEmail]
public string Email { get; set; } = null!;
[Required]
[MaxLength(30, ErrorMessage = "Password maximum length is 30")]
[StrongPassword]
- [DefaultValue(AuthConstants.Password)]
public string Password { get; set; } = null!;
[Required]
[Display(Name = "Confirm password")]
[MaxLength(30, ErrorMessage = "Password maximum length is 30")]
- [DefaultValue("")]
[Compare(nameof(Password))]
public string PasswordConfirmation { get; set; } = null!;
}
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/Create/StreetcodeCreateDTO.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/Create/StreetcodeCreateDTO.cs
index e19dd07a8..6a76d6cae 100644
--- a/Streetcode/Streetcode.BLL/DTO/Streetcode/Create/StreetcodeCreateDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/Create/StreetcodeCreateDTO.cs
@@ -3,29 +3,40 @@
using Streetcode.BLL.DTO.AdditionalContent.Tag;
using Streetcode.BLL.DTO.Analytics;
using Streetcode.BLL.DTO.Media.Video;
-using Streetcode.BLL.DTO.Partners;
using Streetcode.BLL.DTO.Sources;
using Streetcode.BLL.DTO.Streetcode.RelatedFigure;
using Streetcode.BLL.DTO.Streetcode.TextContent.Fact;
using Streetcode.BLL.DTO.Streetcode.TextContent.Text;
-namespace Streetcode.BLL.DTO.Streetcode.Create
+namespace Streetcode.BLL.DTO.Streetcode.Create;
+
+public class StreetcodeCreateDTO : StreetcodeCreateUpdateDTO
{
- public class StreetcodeCreateDTO : StreetcodeCreateUpdateDTO
- {
- public string? ARBlockURL { get; set; }
- public int ViewCount { get; set; }
- public TextCreateDTO? Text { get; set; }
- public int? AudioId { get; set; }
- public IEnumerable ImagesIds { get; set; } = null!; // one image black and white is required at front-end side, so at least one will be passed
- public IEnumerable Tags { get; set; } = null!;
- public IEnumerable Subtitles { get; set; } = null!; // subtitles are only in one example
- public IEnumerable Facts { get; set; } = null!;
- public IEnumerable? Videos { get; set; } = null!; // video is only one
- public IEnumerable RelatedFigures { get; set; } = null!;
- public IEnumerable Partners { get; set; } = null!;
- public IEnumerable StreetcodeCategoryContents { get; set; } = null!;
- public IEnumerable Coordinates { get; set; } = null!;
- public IEnumerable StatisticRecords { get; set; } = null!;
- }
-}
+ public string? ArBlockUrl { get; set; }
+
+ public int ViewCount { get; set; }
+
+ public TextCreateDTO? Text { get; set; }
+
+ public int? AudioId { get; set; }
+
+ public IEnumerable ImagesIds { get; set; } = new List();
+
+ public IEnumerable? Tags { get; set; } = new List();
+
+ public IEnumerable? Subtitles { get; set; } = new List();
+
+ public IEnumerable? Facts { get; set; } = new List();
+
+ public IEnumerable? Videos { get; set; } = new List();
+
+ public IEnumerable? RelatedFigures { get; set; } = new List();
+
+ public IEnumerable? Partners { get; set; } = new List();
+
+ public IEnumerable? StreetcodeCategoryContents { get; set; } = new List();
+
+ public IEnumerable? Coordinates { get; set; } = new List();
+
+ public IEnumerable? StatisticRecords { get; set; } = new List();
+}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeCreateUpdateDTO.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeCreateUpdateDTO.cs
index 328f42a5b..2da0033b4 100644
--- a/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeCreateUpdateDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeCreateUpdateDTO.cs
@@ -1,5 +1,4 @@
-using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
-using Streetcode.BLL.DTO.Media.Art;
+using Streetcode.BLL.DTO.Media.Art;
using Streetcode.BLL.DTO.Media.Create;
using Streetcode.BLL.DTO.Media.Images;
using Streetcode.BLL.DTO.Timeline.Update;
@@ -11,20 +10,36 @@ namespace Streetcode.BLL.DTO.Streetcode;
public abstract class StreetcodeCreateUpdateDTO
{
public string? FirstName { get; set; }
+
public string? LastName { get; set; }
+
public int Index { get; set; }
- public string? Teaser { get; set; } // in the requirements it's not specified whether it is a mandatory property or not
- public string DateString { get; set; } = null!; // date in a pretty format
- public string? Alias { get; set; } // this is "Короткий опис (для зв'язків історії)"
- public StreetcodeStatus Status { get; set; } // passed as a number
- public StreetcodeType StreetcodeType { get; set; } // an event or a person
- public string Title { get; set; } = null!; // this is "Назва стріткоду"
- public string TransliterationUrl { get; set; } = null!; // this is "URL"
+
+ public string? Teaser { get; set; }
+
+ public string DateString { get; set; } = null!;
+
+ public string? Alias { get; set; }
+
+ public StreetcodeStatus Status { get; set; }
+
+ public StreetcodeType StreetcodeType { get; set; }
+
+ public string Title { get; set; } = null!;
+
+ public string TransliterationUrl { get; set; } = null!;
+
public DateTime EventStartOrPersonBirthDate { get; set; }
+
public DateTime? EventEndOrPersonDeathDate { get; set; }
- public IEnumerable Toponyms { get; set; } = null!;
- public IEnumerable TimelineItems { get; set; } = null!;
- public IEnumerable? ImagesDetails { get; set; } // strange behaviour, a random number is passed as 'Alt' property
- public IEnumerable StreetcodeArtSlides { get; set; } = null!;
- public List Arts { get; set; } = null!;
+
+ public IEnumerable? Toponyms { get; set; } = new List();
+
+ public IEnumerable? TimelineItems { get; set; } = new List();
+
+ public IEnumerable ImagesDetails { get; set; } = new List();
+
+ public IEnumerable? StreetcodeArtSlides { get; set; } = new List();
+
+ public List? Arts { get; set; } = new List();
}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeFavouriteDTO.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeFavouriteDTO.cs
new file mode 100644
index 000000000..9aec4a255
--- /dev/null
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/StreetcodeFavouriteDTO.cs
@@ -0,0 +1,14 @@
+using Streetcode.DAL.Enums;
+
+namespace Streetcode.BLL.DTO.Streetcode
+{
+ public class StreetcodeFavouriteDto
+ {
+ public int Id { get; set; }
+ public string Title { get; set; } = null!;
+ public string? Alias { get; set; }
+ public int ImageId { get; set; }
+ public string TransliterationUrl { get; set; } = null!;
+ public StreetcodeType Type { get; set; }
+ }
+}
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/FactUpdateCreateDto.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/FactUpdateCreateDto.cs
index 7047918a3..d3c6d827d 100644
--- a/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/FactUpdateCreateDto.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/FactUpdateCreateDto.cs
@@ -1,11 +1,16 @@
-namespace Streetcode.BLL.DTO.Streetcode.TextContent.Fact
+namespace Streetcode.BLL.DTO.Streetcode.TextContent.Fact;
+
+public abstract class FactUpdateCreateDto
{
- public abstract class FactUpdateCreateDto
- {
- public string Title { get; set; }
- public int ImageId { get; set; }
- public string FactContent { get; set; }
- public int Index { get; set; }
- public string? ImageDescription { get; set; }
- }
-}
\ No newline at end of file
+ public string Title { get; set; }
+
+ public int ImageId { get; set; }
+
+ public string FactContent { get; set; }
+
+ public int StreetcodeId { get; set; }
+
+ public int Index { get; set; }
+
+ public string? ImageDescription { get; set; }
+}
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/StreetcodeFactUpdateDTO.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/StreetcodeFactUpdateDTO.cs
index 1a52ae47c..9237af32c 100644
--- a/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/StreetcodeFactUpdateDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/TextContent/Fact/StreetcodeFactUpdateDTO.cs
@@ -1,12 +1,11 @@
using Streetcode.BLL.DTO.Streetcode.Update.Interfaces;
using Streetcode.BLL.Enums;
-namespace Streetcode.BLL.DTO.Streetcode.TextContent.Fact
+namespace Streetcode.BLL.DTO.Streetcode.TextContent.Fact;
+
+public class StreetcodeFactUpdateDTO : FactUpdateCreateDto, IModelState
{
- public class StreetcodeFactUpdateDTO : FactUpdateCreateDto, IModelState
- {
public int Id { get; set; }
+
public ModelState ModelState { get; set; }
- public int StreetcodeId { get; set; }
- }
}
diff --git a/Streetcode/Streetcode.BLL/DTO/Streetcode/Update/StreetcodeUpdateDTO.cs b/Streetcode/Streetcode.BLL/DTO/Streetcode/Update/StreetcodeUpdateDTO.cs
index 59116c2bb..ef6df33b4 100644
--- a/Streetcode/Streetcode.BLL/DTO/Streetcode/Update/StreetcodeUpdateDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Streetcode/Update/StreetcodeUpdateDTO.cs
@@ -1,9 +1,7 @@
using Streetcode.BLL.DTO.AdditionalContent.Subtitles;
using Streetcode.BLL.DTO.AdditionalContent.Tag;
using Streetcode.BLL.DTO.Analytics.Update;
-using Streetcode.BLL.DTO.Media.Art;
using Streetcode.BLL.DTO.Media.Audio;
-using Streetcode.BLL.DTO.Media.Create;
using Streetcode.BLL.DTO.Media.Images;
using Streetcode.BLL.DTO.Media.Video;
using Streetcode.BLL.DTO.Partners.Update;
@@ -11,27 +9,34 @@
using Streetcode.BLL.DTO.Streetcode.RelatedFigure;
using Streetcode.BLL.DTO.Streetcode.TextContent.Fact;
using Streetcode.BLL.DTO.Streetcode.TextContent.Text;
-using Streetcode.BLL.DTO.Timeline.Update;
-using Streetcode.BLL.DTO.Toponyms;
-using Streetcode.BLL.DTO.Transactions;
-using Streetcode.DAL.Enums;
-namespace Streetcode.BLL.DTO.Streetcode.Update
+namespace Streetcode.BLL.DTO.Streetcode.Update;
+
+public class StreetcodeUpdateDTO : StreetcodeCreateUpdateDTO
{
- public class StreetcodeUpdateDTO : StreetcodeCreateUpdateDTO
- {
- public int Id { get; set; }
- public TextUpdateDTO? Text { get; set; }
- public string? ARBlockUrl { get; set; }
- public IEnumerable Subtitles { get; set; } = null!;
- public IEnumerable Facts { get; set; }
- public IEnumerable? Videos { get; set; }
- public IEnumerable Audios { get; set; } = null!;
- public IEnumerable RelatedFigures { get; set; } = null!;
- public IEnumerable Partners { get; set; } = null!;
- public IEnumerable Tags { get; set; } = null!;
- public IEnumerable StatisticRecords { get; set; }
- public IEnumerable Images { get; set; } = null!;
- public IEnumerable StreetcodeCategoryContents { get; set; }
- }
-}
+ public int Id { get; set; }
+
+ public TextUpdateDTO? Text { get; set; }
+
+ public string? ArBlockUrl { get; set; }
+
+ public IEnumerable? Subtitles { get; set; } = new List();
+
+ public IEnumerable? Facts { get; set; } = new List();
+
+ public IEnumerable? Videos { get; set; } = new List();
+
+ public IEnumerable? Audios { get; set; } = new List();
+
+ public IEnumerable? RelatedFigures { get; set; } = new List();
+
+ public IEnumerable? Partners { get; set; } = new List();
+
+ public IEnumerable? Tags { get; set; } = new List();
+
+ public IEnumerable? StatisticRecords { get; set; } = new List();
+
+ public IEnumerable Images { get; set; } = new List();
+
+ public IEnumerable? StreetcodeCategoryContents { get; set; } = new List();
+}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/DTO/Timeline/GetAllHistoricalContextDTO.cs b/Streetcode/Streetcode.BLL/DTO/Timeline/GetAllHistoricalContextDTO.cs
index 3a9797b95..475df7568 100644
--- a/Streetcode/Streetcode.BLL/DTO/Timeline/GetAllHistoricalContextDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Timeline/GetAllHistoricalContextDTO.cs
@@ -1,10 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace Streetcode.BLL.DTO.Timeline
+namespace Streetcode.BLL.DTO.Timeline
{
public class GetAllHistoricalContextDTO
{
diff --git a/Streetcode/Streetcode.BLL/DTO/Transactions/TransactionLinkUpdateDTO.cs b/Streetcode/Streetcode.BLL/DTO/Transactions/TransactionLinkUpdateDTO.cs
deleted file mode 100644
index fefdd0045..000000000
--- a/Streetcode/Streetcode.BLL/DTO/Transactions/TransactionLinkUpdateDTO.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using Streetcode.BLL.DTO.Streetcode.Update.Interfaces;
-using Streetcode.BLL.Enums;
-
-namespace Streetcode.BLL.DTO.Transactions
-{
- public class TransactionLinkUpdateDTO : TransactLinkDTO, IModelState
- {
- public ModelState ModelState { get; set; }
- }
-}
diff --git a/Streetcode/Streetcode.BLL/DTO/Users/Password/UpdateForgotPasswordDTO.cs b/Streetcode/Streetcode.BLL/DTO/Users/Password/UpdateForgotPasswordDTO.cs
index 8b6bdf7d5..dd2e37ab0 100644
--- a/Streetcode/Streetcode.BLL/DTO/Users/Password/UpdateForgotPasswordDTO.cs
+++ b/Streetcode/Streetcode.BLL/DTO/Users/Password/UpdateForgotPasswordDTO.cs
@@ -1,5 +1,5 @@
using System.ComponentModel.DataAnnotations;
-using Microsoft.AspNetCore.Mvc;
+using Streetcode.BLL.Attributes.Authentication;
namespace Streetcode.BLL.DTO.Users.Password;
@@ -7,7 +7,9 @@ public class UpdateForgotPasswordDTO
{
public string Token { get; set; }
public string Username { get; set; }
+ [StrongPassword]
public string Password { get; set; } = null!;
[Compare(nameof(Password))]
+ [StrongPassword]
public string ConfirmPassword { get; set; } = null!;
}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/Interfaces/Authentication/IGoogleService.cs b/Streetcode/Streetcode.BLL/Interfaces/Authentication/IGoogleService.cs
new file mode 100644
index 000000000..d3134ea81
--- /dev/null
+++ b/Streetcode/Streetcode.BLL/Interfaces/Authentication/IGoogleService.cs
@@ -0,0 +1,9 @@
+using Google.Apis.Auth;
+
+namespace Streetcode.BLL.Interfaces.Authentication
+{
+ public interface IGoogleService
+ {
+ Task ValidateGoogleToken(string id);
+ }
+}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/Mapping/Streetcode/RelatedFigureProfile.cs b/Streetcode/Streetcode.BLL/Mapping/Streetcode/RelatedFigureProfile.cs
index c1b3bd5b9..67fd01dde 100644
--- a/Streetcode/Streetcode.BLL/Mapping/Streetcode/RelatedFigureProfile.cs
+++ b/Streetcode/Streetcode.BLL/Mapping/Streetcode/RelatedFigureProfile.cs
@@ -25,5 +25,8 @@ public RelatedFigureProfile()
CreateMap();
CreateMap();
+ CreateMap()
+ .ForPath(dto => dto.ImageId, conf => conf
+ .MapFrom(e => e.Images.Select(i => i.Id).LastOrDefault())).ReverseMap();
}
}
diff --git a/Streetcode/Streetcode.BLL/Mapping/Streetcode/StreetcodeProfile.cs b/Streetcode/Streetcode.BLL/Mapping/Streetcode/StreetcodeProfile.cs
index a89ee398e..c1df1f03f 100644
--- a/Streetcode/Streetcode.BLL/Mapping/Streetcode/StreetcodeProfile.cs
+++ b/Streetcode/Streetcode.BLL/Mapping/Streetcode/StreetcodeProfile.cs
@@ -1,5 +1,4 @@
using AutoMapper;
-using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Streetcode.BLL.DTO.Streetcode;
using Streetcode.BLL.DTO.Streetcode.Create;
using Streetcode.BLL.DTO.Streetcode.Update;
@@ -7,8 +6,6 @@
using Streetcode.DAL.Entities.Streetcode;
using Streetcode.DAL.Entities.Streetcode.Types;
using Streetcode.DAL.Enums;
-using Streetcode.DAL.Repositories.Interfaces.Base;
-using StringToDateTimeConverter = Streetcode.BLL.Mapping.Converters.StringToDateTimeConverter;
namespace Streetcode.BLL.Mapping.Streetcode;
@@ -27,6 +24,12 @@ public StreetcodeProfile()
.ForPath(dto => dto.ImageId, conf => conf
.MapFrom(e => e.Images.Select(i => i.Id).FirstOrDefault()));
+ CreateMap()
+ .ForMember(x => x.Type, conf => conf.MapFrom(s => GetStreetcodeType(s)))
+ .ForPath(dto => dto.ImageId, conf => conf
+ .MapFrom(e => e.Images.Select(i => i.Id).FirstOrDefault()))
+ .ReverseMap();
+
CreateMap()
.ForMember(x => x.Arts, conf => conf.Ignore())
.ForMember(x => x.StreetcodeArtSlides, conf => conf.Ignore())
@@ -50,7 +53,7 @@ public StreetcodeProfile()
.ForMember(x => x.StatisticRecords, conf => conf.Ignore())
.ForMember(x => x.StreetcodeArtSlides, conf => conf.Ignore())
.ForMember(x => x.Facts, conf => conf.Ignore())
- .ForPath(x => x.TransactionLink!.Url, conf => conf.MapFrom(x => x.ARBlockUrl))
+ .ForPath(x => x.TransactionLink!.Url, conf => conf.MapFrom(x => x.ArBlockUrl))
.ReverseMap();
CreateMap()
@@ -62,13 +65,10 @@ public StreetcodeProfile()
.ReverseMap();
}
- private StreetcodeType GetStreetcodeType(StreetcodeContent streetcode)
- {
- if(streetcode is EventStreetcode)
+ private static StreetcodeType GetStreetcodeType(StreetcodeContent streetcode) =>
+ streetcode switch
{
- return StreetcodeType.Event;
- }
-
- return StreetcodeType.Person;
- }
+ EventStreetcode => StreetcodeType.Event,
+ _ => StreetcodeType.Person
+ };
}
diff --git a/Streetcode/Streetcode.BLL/Mapping/Transactions/TransactionLinkProfile.cs b/Streetcode/Streetcode.BLL/Mapping/Transactions/TransactionLinkProfile.cs
index ce6ce15b7..27967bfed 100644
--- a/Streetcode/Streetcode.BLL/Mapping/Transactions/TransactionLinkProfile.cs
+++ b/Streetcode/Streetcode.BLL/Mapping/Transactions/TransactionLinkProfile.cs
@@ -10,8 +10,5 @@ public TransactionLinkProfile()
{
CreateMap()
.ReverseMap();
-
- CreateMap()
- .ReverseMap();
}
}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordCommand.cs
deleted file mode 100644
index 1904e0154..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordCommand.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using FluentResults;
-using MediatR;
-using Streetcode.BLL.DTO.Analytics;
-
-namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.Create
-{
- public record CreateStatisticRecordCommand(StatisticRecordDTO StatisticRecordDTO)
- : IRequest>;
-}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordHandler.cs
deleted file mode 100644
index 2df57f4bd..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Create/CreateStatisticRecordHandler.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-using AutoMapper;
-using FluentResults;
-using MediatR;
-using Microsoft.Extensions.Localization;
-using Streetcode.BLL.DTO.Analytics;
-using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.SharedResource;
-using Streetcode.DAL.Repositories.Interfaces.Base;
-
-using Entity = Streetcode.DAL.Entities.Analytics.StatisticRecord;
-
-namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.Create
-{
- public class CreateStatisticRecordHandler : IRequestHandler>
- {
- private readonly IMapper _mapper;
- private readonly IRepositoryWrapper _repositoryWrapper;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerNo;
- private readonly IStringLocalizer _stringLocalizer;
-
- public CreateStatisticRecordHandler(
- IMapper mapper,
- IRepositoryWrapper repositoryWrapper,
- ILoggerService logger,
- IStringLocalizer stringLocalizer,
- IStringLocalizer stringLocalizerNo)
- {
- _mapper = mapper;
- _repositoryWrapper = repositoryWrapper;
- _logger = logger;
- _stringLocalizer = stringLocalizer;
- _stringLocalizerNo = stringLocalizerNo;
- }
-
- public async Task> Handle(CreateStatisticRecordCommand request, CancellationToken cancellationToken)
- {
- var statRecord = _mapper.Map(request.StatisticRecordDTO);
-
- if (statRecord == null)
- {
- string errorMsg = _stringLocalizerNo["NoMappedRecord"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- var createdRecord = _repositoryWrapper.StatisticRecordRepository.Create(statRecord);
-
- if (createdRecord == null)
- {
- string errorMsg = _stringLocalizer["NoCreatedRecord"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
-
- if (!resultIsSuccess)
- {
- string errorMsg = _stringLocalizer["CannotSaveCreatedRecord"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- var mappedCreatedRecord = _mapper.Map(createdRecord);
-
- if (mappedCreatedRecord == null)
- {
- string errorMsg = _stringLocalizer["NoMappedCreatedRecord"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- return Result.Ok(mappedCreatedRecord);
- }
- }
-}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Delete/DeleteStatisticRecordHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Delete/DeleteStatisticRecordHandler.cs
index eb18ba18d..6cdb0b8a4 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Delete/DeleteStatisticRecordHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/Delete/DeleteStatisticRecordHandler.cs
@@ -1,5 +1,4 @@
-using AutoMapper;
-using FluentResults;
+using FluentResults;
using MediatR;
using Microsoft.Extensions.Localization;
using Streetcode.BLL.Interfaces.Logging;
@@ -10,20 +9,17 @@ namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.Delete
{
public class DeleteStatisticRecordHandler : IRequestHandler>
{
- private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ILoggerService _logger;
private readonly IStringLocalizer _stringLocalizerCannotFind;
private readonly IStringLocalizer _stringLocalizerFailedToDelete;
public DeleteStatisticRecordHandler(
- IMapper mapper,
IRepositoryWrapper repositoryWrapper,
ILoggerService logger,
IStringLocalizer stringLocalizerCannotFind,
IStringLocalizer stringLocalizerFailedToDelete)
{
- _mapper = mapper;
_repositoryWrapper = repositoryWrapper;
_logger = logger;
_stringLocalizerCannotFind = stringLocalizerCannotFind;
@@ -44,7 +40,7 @@ public async Task> Handle(DeleteStatisticRecordCommand request, Can
_repositoryWrapper.StatisticRecordRepository.Delete(statRecord);
- var resultIsSuccess = _repositoryWrapper.SaveChanges() > 0;
+ var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
if (resultIsSuccess)
{
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/ExistByQrId/ExistStatisticRecordByQrIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/ExistByQrId/ExistStatisticRecordByQrIdHandler.cs
index de54ee00a..0de3c143b 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/ExistByQrId/ExistStatisticRecordByQrIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/ExistByQrId/ExistStatisticRecordByQrIdHandler.cs
@@ -1,19 +1,15 @@
-using AutoMapper;
-using FluentResults;
+using FluentResults;
using MediatR;
-using Streetcode.BLL.Interfaces.Logging;
using Streetcode.DAL.Repositories.Interfaces.Base;
namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.ExistByQrId
{
public class ExistStatisticRecordByQrIdHandler : IRequestHandler>
{
- private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repository;
- public ExistStatisticRecordByQrIdHandler(IMapper mapper, IRepositoryWrapper repository)
+ public ExistStatisticRecordByQrIdHandler(IRepositoryWrapper repository)
{
- _mapper = mapper;
_repository = repository;
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAll/GetAllStatisticRecordsQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAll/GetAllStatisticRecordsQuery.cs
index 9559e8405..31924bf73 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAll/GetAllStatisticRecordsQuery.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAll/GetAllStatisticRecordsQuery.cs
@@ -4,6 +4,6 @@
namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.GetAll
{
- public record GetAllStatisticRecordsQuery()
+ public record GetAllStatisticRecordsQuery
: IRequest>>;
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAllByStreetcodeId/GetAllStatisticRecordsByStreetcodeIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAllByStreetcodeId/GetAllStatisticRecordsByStreetcodeIdHandler.cs
index a9f679d3b..04a0fddf4 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAllByStreetcodeId/GetAllStatisticRecordsByStreetcodeIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/GetAllByStreetcodeId/GetAllStatisticRecordsByStreetcodeIdHandler.cs
@@ -10,26 +10,23 @@
namespace Streetcode.BLL.MediatR.Analytics.StatisticRecord.GetAllByStreetcodeId
{
- internal class GetAllStatisticRecordsByStreetcodeIdHandler : IRequestHandler>>
+ public class GetAllStatisticRecordsByStreetcodeIdHandler : IRequestHandler>>
{
private readonly IRepositoryWrapper _repository;
private readonly IMapper _mapper;
private readonly ILoggerService _logger;
private readonly IStringLocalizer _stringLocalizerCannotFind;
- private readonly IStringLocalizer _stringLocalizerCannotMap;
public GetAllStatisticRecordsByStreetcodeIdHandler(
IRepositoryWrapper repositoryWrapper,
IMapper mapper,
ILoggerService logger,
- IStringLocalizer stringLocalizerCannotFind,
- IStringLocalizer stringLocalizerCannotMap)
+ IStringLocalizer stringLocalizerCannotFind)
{
_repository = repositoryWrapper;
_mapper = mapper;
_logger = logger;
_stringLocalizerCannotFind = stringLocalizerCannotFind;
- _stringLocalizerCannotMap = stringLocalizerCannotMap;
}
public async Task>> Handle(GetAllStatisticRecordsByStreetcodeIdQuery request, CancellationToken cancellationToken)
@@ -38,7 +35,7 @@ public async Task>> Handle(GetAllStatisti
predicate: st => st.StreetcodeCoordinate.StreetcodeId == request.streetcodeId,
include: st => st.Include(st => st.StreetcodeCoordinate));
- if (statisticRecords is null)
+ if (!statisticRecords.Any())
{
string errorMsg = _stringLocalizerCannotFind["CannotFindRecordWithStreetcodeId", request.streetcodeId];
_logger.LogError(request, errorMsg);
@@ -47,13 +44,6 @@ public async Task>> Handle(GetAllStatisti
var statisticRecordsDTOs = _mapper.Map>(statisticRecords);
- if (statisticRecordsDTOs is null)
- {
- string errorMsg = _stringLocalizerCannotMap["CannotMapRecord"];
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
return Result.Ok(statisticRecordsDTOs);
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/UpdateCount/UpdateCountStatisticRecordHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/UpdateCount/UpdateCountStatisticRecordHandler.cs
index 8bf9eea44..2d22b8fe2 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/UpdateCount/UpdateCountStatisticRecordHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Analytics/StatisticRecord/UpdateCount/UpdateCountStatisticRecordHandler.cs
@@ -1,5 +1,4 @@
-using AutoMapper;
-using FluentResults;
+using FluentResults;
using MediatR;
using Streetcode.BLL.Interfaces.Logging;
using Microsoft.Extensions.Localization;
@@ -44,7 +43,7 @@ public async Task> Handle(UpdateCountStatisticRecordCommand request
_repositoryWrapper.StatisticRecordRepository.Update(statRecord);
- var resultIsSuccess = _repositoryWrapper.SaveChanges() > 0;
+ var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
if (!resultIsSuccess)
{
diff --git a/Streetcode/Streetcode.BLL/MediatR/Authentication/LoginGoogle/LoginGoogleHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Authentication/LoginGoogle/LoginGoogleHandler.cs
index b10faba91..bf1a62f36 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Authentication/LoginGoogle/LoginGoogleHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Authentication/LoginGoogle/LoginGoogleHandler.cs
@@ -1,7 +1,6 @@
using System.IdentityModel.Tokens.Jwt;
using AutoMapper;
using FluentResults;
-using Google.Apis.Auth;
using MediatR;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Configuration;
@@ -18,34 +17,31 @@ namespace Streetcode.BLL.MediatR.Authentication.LoginGoogle;
public class LoginGoogleHandler : IRequestHandler>
{
private const string LoginProvider = "Google";
- private readonly IConfiguration _configuration;
private readonly IMapper _mapper;
private readonly ITokenService _tokenService;
private readonly ILoggerService _logger;
private readonly UserManager _userManager;
+ private readonly IGoogleService _googleService;
public LoginGoogleHandler(
- IConfiguration configuration,
IMapper mapper,
ITokenService tokenService,
ILoggerService logger,
- UserManager userManager)
+ UserManager userManager,
+ IGoogleService googleService)
{
- _configuration = configuration;
_mapper = mapper;
_tokenService = tokenService;
_logger = logger;
_userManager = userManager;
+ _googleService = googleService;
}
public async Task> Handle(LoginGoogleQuery request, CancellationToken cancellationToken)
{
try
{
- var payload = await GoogleJsonWebSignature.ValidateAsync(request.idToken, new GoogleJsonWebSignature.ValidationSettings
- {
- Audience = new[] { _configuration["Authentication:Google:ClientId"] }
- });
+ var payload = await _googleService.ValidateGoogleToken(request.idToken);
var user = await _userManager.FindByEmailAsync(payload.Email);
if (user == null)
diff --git a/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutCommand.cs
index ce58d3a7e..d31e2d5e1 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutCommand.cs
@@ -3,4 +3,4 @@
namespace Streetcode.BLL.MediatR.Authentication.Logout;
-public record LogoutCommand(string UserId) : IRequest;
+public record LogoutCommand : IRequest;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutHandler.cs
index a9502ca83..cd5b92cb2 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Authentication/Logout/LogoutHandler.cs
@@ -1,7 +1,7 @@
using FluentResults;
using MediatR;
-using Microsoft.EntityFrameworkCore;
-using Streetcode.DAL.Persistence;
+using Microsoft.AspNetCore.Http;
+using Streetcode.BLL.Util.Helpers;
using Streetcode.DAL.Repositories.Interfaces.Base;
namespace Streetcode.BLL.MediatR.Authentication.Logout;
@@ -9,15 +9,20 @@ namespace Streetcode.BLL.MediatR.Authentication.Logout;
public class LogoutHandler : IRequestHandler
{
private readonly IRepositoryWrapper _repositoryWrapper;
+ private readonly IHttpContextAccessor _httpContextAccessor;
- public LogoutHandler(IRepositoryWrapper repositoryWrapper)
+ public LogoutHandler(
+ IRepositoryWrapper repositoryWrapper,
+ IHttpContextAccessor httpContextAccessor)
{
_repositoryWrapper = repositoryWrapper;
+ _httpContextAccessor = httpContextAccessor;
}
public async Task Handle(LogoutCommand request, CancellationToken cancellationToken)
{
- var user = await _repositoryWrapper.UserRepository.GetFirstOrDefaultAsync(u => u.Id == request.UserId);
+ var userUserName = HttpContextHelper.GetCurrentUserName(_httpContextAccessor);
+ var user = await _repositoryWrapper.UserRepository.GetFirstOrDefaultAsync(u => u.UserName == userUserName);
if (user == null)
{
@@ -34,10 +39,8 @@ public async Task Handle(LogoutCommand request, CancellationToken cancel
{
return Result.Ok();
}
- else
- {
- string errorMsg = "Failed to logout";
- return Result.Fail(new Error(errorMsg));
- }
+
+ string errorMsg = "Failed to logout";
+ return Result.Fail(new Error(errorMsg));
}
}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs
index 4023f85fc..f2f3c153a 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Email/SendEmailHandler.cs
@@ -7,7 +7,6 @@
using Streetcode.BLL.Factories.MessageDataFactory.Abstracts;
using Streetcode.BLL.Interfaces.Email;
using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.Models.Email.Messages;
namespace Streetcode.BLL.MediatR.Email
{
@@ -69,12 +68,10 @@ public async Task> Handle(SendEmailCommand request, CancellationTok
{
return Result.Ok(Unit.Value);
}
- else
- {
- string errorMsg = _stringLocalizer["FailedToSendEmailMessage"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+
+ string errorMsg = _stringLocalizer["FailedToSendEmailMessage"].Value;
+ _logger.LogError(request, errorMsg);
+ return Result.Fail(new Error(errorMsg));
}
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsHandler.cs
deleted file mode 100644
index 44d885850..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsHandler.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using FluentResults;
-using MediatR;
-using Streetcode.BLL.Interfaces.Instagram;
-using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.DAL.Entities.Instagram;
-
-namespace Streetcode.BLL.MediatR.Instagram.GetAll
-{
- public class GetAllPostsHandler : IRequestHandler>>
- {
- private readonly IInstagramService _instagramService;
-
- public GetAllPostsHandler(IInstagramService instagramService)
- {
- _instagramService = instagramService;
- }
-
- public async Task>> Handle(GetAllPostsQuery request, CancellationToken cancellationToken)
- {
- var result = await _instagramService.GetPostsAsync();
- return Result.Ok(result);
- }
- }
-}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsQuery.cs
deleted file mode 100644
index f5cce0128..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Instagram/GetAll/GetAllPostsQuery.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using FluentResults;
-using MediatR;
-using Streetcode.DAL.Entities.Instagram;
-
-namespace Streetcode.BLL.MediatR.Instagram.GetAll;
-
-public record GetAllPostsQuery : IRequest>>;
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesHandler.cs
deleted file mode 100644
index 64f6e4144..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesHandler.cs
+++ /dev/null
@@ -1,50 +0,0 @@
-using AutoMapper;
-using FluentResults;
-using MediatR;
-using Microsoft.Extensions.Localization;
-using Streetcode.BLL.DTO.Media.Images;
-using Streetcode.BLL.Interfaces.BlobStorage;
-using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.SharedResource;
-using Streetcode.DAL.Repositories.Interfaces.Base;
-
-namespace Streetcode.BLL.MediatR.Media.Image.GetAll;
-
-public class GetAllImagesHandler : IRequestHandler>>
-{
- private readonly IMapper _mapper;
- private readonly IRepositoryWrapper _repositoryWrapper;
- private readonly IBlobService _blobService;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotFind;
-
- public GetAllImagesHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper, IBlobService blobService, ILoggerService logger, IStringLocalizer stringLocalizerCannotFind)
- {
- _repositoryWrapper = repositoryWrapper;
- _mapper = mapper;
- _blobService = blobService;
- _logger = logger;
- _stringLocalizerCannotFind = stringLocalizerCannotFind;
- }
-
- public async Task>> Handle(GetAllImagesQuery request, CancellationToken cancellationToken)
- {
- var images = await _repositoryWrapper.ImageRepository.GetAllAsync();
-
- if (images is null)
- {
- string errorMsg = _stringLocalizerCannotFind["CannotFindAnyImage"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- var imageDtos = _mapper.Map>(images);
-
- foreach (var image in imageDtos)
- {
- image.Base64 = _blobService.FindFileInStorageAsBase64(image.BlobName);
- }
-
- return Result.Ok(imageDtos);
- }
-}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesQuery.cs
deleted file mode 100644
index db74acdae..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Media/Image/GetAll/GetAllImagesQuery.cs
+++ /dev/null
@@ -1,7 +0,0 @@
-using FluentResults;
-using MediatR;
-using Streetcode.BLL.DTO.Media.Images;
-
-namespace Streetcode.BLL.MediatR.Media.Image.GetAll;
-
-public record GetAllImagesQuery : IRequest>>;
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Partners/GetToUpdateByStreetcodeId/GetPartnersToUpdateByStreetcodeIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Partners/GetToUpdateByStreetcodeId/GetPartnersToUpdateByStreetcodeIdHandler.cs
index 2a79134db..d48d5104e 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Partners/GetToUpdateByStreetcodeId/GetPartnersToUpdateByStreetcodeIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Partners/GetToUpdateByStreetcodeId/GetPartnersToUpdateByStreetcodeIdHandler.cs
@@ -32,11 +32,12 @@ public async Task>> Handle(GetPartnersToUpdateByS
predicate: p => p.Streetcodes.Any(sc => sc.Id == request.StreetcodeId),
include: p => p.Include(pl => pl.PartnerSourceLinks));
+ // even if there are no partners, we still want to return an empty enumerable
if (!partners.Any())
{
- string errorMsg = _stringLocalizerCannotFind["CannotFindPartnersByStreetcodeId", request.StreetcodeId].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ string message = "Returning empty enumerable of partners to update";
+ _logger.LogInformation(message);
+ return Result.Ok(Enumerable.Empty());
}
return Result.Ok(value: _mapper.Map>(partners));
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactCommand.cs
index afe8173c0..fbb98a772 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactCommand.cs
@@ -4,4 +4,5 @@
namespace Streetcode.BLL.MediatR.Streetcode.Fact.Create;
-public record CreateFactCommand(StreetcodeFactCreateDTO Fact) : IRequest>;
\ No newline at end of file
+public record CreateFactCommand(StreetcodeFactCreateDTO Fact)
+ : IRequest>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactHandler.cs
index 0ac08f331..44c7c572f 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Create/CreateFactHandler.cs
@@ -5,6 +5,7 @@
using Streetcode.BLL.Interfaces.Logging;
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
+using FactEntity = Streetcode.DAL.Entities.Streetcode.TextContent.Fact;
namespace Streetcode.BLL.MediatR.Streetcode.Fact.Create;
@@ -32,27 +33,25 @@ public CreateFactHandler(
public async Task> Handle(CreateFactCommand request, CancellationToken cancellationToken)
{
- var fact = _mapper.Map(request.Fact);
+ var fact = _mapper.Map(request.Fact);
if (fact is null)
{
- string errorMsg = _stringLocalizerCannot["CannotConvertNullToFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerCannot["CannotConvertNullToFact"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
- _repositoryWrapper.FactRepository.Create(fact);
-
+ await _repositoryWrapper.FactRepository.CreateAsync(fact);
var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
- if (resultIsSuccess)
- {
- return Result.Ok(Unit.Value);
- }
- else
+
+ if (!resultIsSuccess)
{
- string errorMsg = _stringLocalizerFailed["FailedToCreateFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerFailed["FailedToCreateFact"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
+
+ return Result.Ok(Unit.Value);
}
-}
\ No newline at end of file
+}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactCommand.cs
index e0d1d2715..d4a63f69d 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactCommand.cs
@@ -4,4 +4,4 @@
namespace Streetcode.BLL.MediatR.Streetcode.Fact.Delete;
public record DeleteFactCommand(int Id)
- : IRequest>;
\ No newline at end of file
+ : IRequest>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactHandler.cs
index a5ab05a15..a12ab4091 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Delete/DeleteFactHandler.cs
@@ -28,27 +28,25 @@ public DeleteFactHandler(
public async Task> Handle(DeleteFactCommand request, CancellationToken cancellationToken)
{
- var fact = await _repositoryWrapper.FactRepository.GetFirstOrDefaultAsync(f => f.Id == request.Id);
+ var fact = await _repositoryWrapper.FactRepository.GetFirstOrDefaultAsync(x => x.Id == request.Id);
if (fact is null)
{
- string errorMsg = _stringLocalizerCannotFind["CannotFindFactWithCorrespondingCategoryId", request.Id].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerCannotFind["CannotFindFactWithCorrespondingCategoryId", request.Id].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
_repositoryWrapper.FactRepository.Delete(fact);
-
var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
- if (resultIsSuccess)
- {
- return Result.Ok(Unit.Value);
- }
- else
+
+ if (!resultIsSuccess)
{
- string errorMsg = _stringLocalizerFailedToDelete["FailedToDeleteFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerFailedToDelete["FailedToDeleteFact"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
+
+ return Result.Ok(Unit.Value);
}
-}
\ No newline at end of file
+}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsHandler.cs
index ee2170cf5..301c0d440 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsHandler.cs
@@ -1,10 +1,7 @@
using AutoMapper;
using FluentResults;
using MediatR;
-using Microsoft.Extensions.Localization;
using Streetcode.BLL.DTO.Streetcode.TextContent.Fact;
-using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
namespace Streetcode.BLL.MediatR.Streetcode.Fact.GetAll;
@@ -13,28 +10,17 @@ public class GetAllFactsHandler : IRequestHandler _stringLocalizeCannotFind;
- public GetAllFactsHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper, ILoggerService logger, IStringLocalizer stringLocalizeCannotFind)
+ public GetAllFactsHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper)
{
_repositoryWrapper = repositoryWrapper;
_mapper = mapper;
- _logger = logger;
- _stringLocalizeCannotFind = stringLocalizeCannotFind;
}
public async Task>> Handle(GetAllFactsQuery request, CancellationToken cancellationToken)
{
var facts = await _repositoryWrapper.FactRepository.GetAllAsync();
- if (facts is null)
- {
- string errorMsg = _stringLocalizeCannotFind["CannotFindAnyFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
return Result.Ok(_mapper.Map>(facts));
}
-}
\ No newline at end of file
+}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsQuery.cs
index b261ec871..b09e38ffd 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsQuery.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetAll/GetAllFactsQuery.cs
@@ -4,4 +4,5 @@
namespace Streetcode.BLL.MediatR.Streetcode.Fact.GetAll;
-public record GetAllFactsQuery : IRequest>>;
\ No newline at end of file
+public record GetAllFactsQuery
+ : IRequest>>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetById/GetFactByIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetById/GetFactByIdHandler.cs
index 101fc2402..ea1fe2437 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetById/GetFactByIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetById/GetFactByIdHandler.cs
@@ -16,7 +16,11 @@ public class GetFactByIdHandler : IRequestHandler _stringLocalizerCannotFind;
- public GetFactByIdHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper, ILoggerService logger, IStringLocalizer stringLocalizerCannotFind)
+ public GetFactByIdHandler(
+ IRepositoryWrapper repositoryWrapper,
+ IMapper mapper,
+ ILoggerService logger,
+ IStringLocalizer stringLocalizerCannotFind)
{
_repositoryWrapper = repositoryWrapper;
_mapper = mapper;
@@ -26,15 +30,15 @@ public GetFactByIdHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper,
public async Task> Handle(GetFactByIdQuery request, CancellationToken cancellationToken)
{
- var facts = await _repositoryWrapper.FactRepository.GetFirstOrDefaultAsync(f => f.Id == request.Id);
+ var facts = await _repositoryWrapper.FactRepository.GetFirstOrDefaultAsync(x => x.Id == request.Id);
if (facts is null)
{
- string errorMsg = _stringLocalizerCannotFind["CannotFindFactWithCorrespondingCategoryId", request.Id].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerCannotFind["CannotFindFactWithCorrespondingCategoryId", request.Id].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
return Result.Ok(_mapper.Map(facts));
}
-}
\ No newline at end of file
+}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdHandler.cs
index 5f737290a..935989625 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdHandler.cs
@@ -16,7 +16,11 @@ public class GetFactByStreetcodeIdHandler : IRequestHandler _stringLocalizerCannotFind;
- public GetFactByStreetcodeIdHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper, ILoggerService logger, IStringLocalizer stringLocalizerCannotFind)
+ public GetFactByStreetcodeIdHandler(
+ IRepositoryWrapper repositoryWrapper,
+ IMapper mapper,
+ ILoggerService logger,
+ IStringLocalizer stringLocalizerCannotFind)
{
_repositoryWrapper = repositoryWrapper;
_mapper = mapper;
@@ -26,16 +30,16 @@ public GetFactByStreetcodeIdHandler(IRepositoryWrapper repositoryWrapper, IMappe
public async Task>> Handle(GetFactByStreetcodeIdQuery request, CancellationToken cancellationToken)
{
- var facts = await _repositoryWrapper.FactRepository
- .GetAllAsync(f => f.StreetcodeId == request.StreetcodeId);
+ var facts = await _repositoryWrapper.FactRepository.GetAllAsync(x => x.StreetcodeId == request.StreetcodeId);
+ var factsList = facts.ToList();
- if (!facts.Any())
+ if (!factsList.Any())
{
- string message = "Returning empty enumerable of facts";
- _logger.LogInformation(message);
+ var infoMessage = _stringLocalizerCannotFind["CannotFindAnyFact"].Value;
+ _logger.LogInformation(infoMessage);
return Result.Ok(Enumerable.Empty());
}
- return Result.Ok(_mapper.Map>(facts.OrderBy(f => f.Index)));
+ return Result.Ok(_mapper.Map>(factsList.OrderBy(f => f.Index)));
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdQuery.cs
index f30d04d64..a5be27954 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdQuery.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/GetByStreetcodeId/GetFactByStreetcodeIdQuery.cs
@@ -5,4 +5,4 @@
namespace Streetcode.BLL.MediatR.Streetcode.Fact.GetByStreetcodeId;
public record GetFactByStreetcodeIdQuery(int StreetcodeId)
- : IRequest>>;
\ No newline at end of file
+ : IRequest>>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactCommand.cs
index 92541e4ca..83b81f650 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactCommand.cs
@@ -4,5 +4,5 @@
namespace Streetcode.BLL.MediatR.Streetcode.Fact.Update;
-public record UpdateFactCommand(FactDto Fact)
- : IRequest>;
\ No newline at end of file
+public record UpdateFactCommand(StreetcodeFactUpdateDTO Fact)
+ : IRequest>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactHandler.cs
index 92de321d5..c55a86999 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/Fact/Update/UpdateFactHandler.cs
@@ -5,6 +5,7 @@
using Streetcode.BLL.Interfaces.Logging;
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
+using FactEntity = Streetcode.DAL.Entities.Streetcode.TextContent.Fact;
namespace Streetcode.BLL.MediatR.Streetcode.Fact.Update;
@@ -32,27 +33,25 @@ public UpdateFactHandler(
public async Task> Handle(UpdateFactCommand request, CancellationToken cancellationToken)
{
- var fact = _mapper.Map(request.Fact);
+ var fact = _mapper.Map(request.Fact);
if (fact is null)
{
- string errorMsg = _stringLocalizerCannotConvert["CannotConvertNullToFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerCannotConvert["CannotConvertNullToFact"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
_repositoryWrapper.FactRepository.Update(fact);
-
var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
- if(resultIsSuccess)
- {
- return Result.Ok(Unit.Value);
- }
- else
+
+ if (!resultIsSuccess)
{
- string errorMsg = _stringLocalizerFailedToUpdate["FailedToUpdateFact"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
+ var errorMessage = _stringLocalizerFailedToUpdate["FailedToUpdateFact"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
+
+ return Result.Ok(Unit.Value);
}
-}
\ No newline at end of file
+}
diff --git "a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/\320\241reate/CreateRelatedFigureCommand.cs" b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Create/CreateRelatedFigureCommand.cs
similarity index 100%
rename from "Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/\320\241reate/CreateRelatedFigureCommand.cs"
rename to Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Create/CreateRelatedFigureCommand.cs
diff --git "a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/\320\241reate/CreateRelatedFigureHandler.cs" b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Create/CreateRelatedFigureHandler.cs
similarity index 76%
rename from "Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/\320\241reate/CreateRelatedFigureHandler.cs"
rename to Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Create/CreateRelatedFigureHandler.cs
index b22f24b0e..9050b5eae 100644
--- "a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/\320\241reate/CreateRelatedFigureHandler.cs"
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Create/CreateRelatedFigureHandler.cs
@@ -1,29 +1,27 @@
-using AutoMapper;
-using FluentResults;
+using FluentResults;
using MediatR;
using Microsoft.Extensions.Localization;
using Streetcode.BLL.Interfaces.Logging;
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
+using Entity = Streetcode.DAL.Entities.Streetcode.RelatedFigure;
namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.Create;
public class CreateRelatedFigureHandler : IRequestHandler>
{
- private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ILoggerService _logger;
private readonly IStringLocalizer _stringLocalizerNo;
private readonly IStringLocalizer _stringLocalizerFailed;
+
public CreateRelatedFigureHandler(
IRepositoryWrapper repositoryWrapper,
- IMapper mapper,
ILoggerService logger,
IStringLocalizer stringLocalizerNo,
IStringLocalizer stringLocalizerFailed)
{
_repositoryWrapper = repositoryWrapper;
- _mapper = mapper;
_logger = logger;
_stringLocalizerFailed = stringLocalizerFailed;
_stringLocalizerNo = stringLocalizerNo;
@@ -36,14 +34,14 @@ public async Task> Handle(CreateRelatedFigureCommand request, Cance
if (observerEntity is null)
{
- string errorMsg = _stringLocalizerNo["NoExistingStreetcodeWithId", request.ObserverId].Value;
+ var errorMsg = _stringLocalizerNo["NoExistingStreetcodeWithId", request.ObserverId].Value;
_logger.LogError(request, errorMsg);
return Result.Fail(new Error(errorMsg));
}
if (targetEntity is null)
{
- string errorMsg = _stringLocalizerNo["NoExistingStreetcodeWithId", request.TargetId].Value;
+ var errorMsg = _stringLocalizerNo["NoExistingStreetcodeWithId", request.TargetId].Value;
_logger.LogError(request, errorMsg);
return Result.Fail(new Error(errorMsg));
}
@@ -54,29 +52,27 @@ public async Task> Handle(CreateRelatedFigureCommand request, Cance
if (existingRelation is not null)
{
- string errorMsg = _stringLocalizerFailed["TheStreetcodesAreAlreadyLinked"].Value;
+ var errorMsg = _stringLocalizerFailed["TheStreetcodesAreAlreadyLinked"].Value;
_logger.LogError(request, errorMsg);
return Result.Fail(new Error(errorMsg));
}
- var relation = new DAL.Entities.Streetcode.RelatedFigure
+ var relation = new Entity
{
ObserverId = observerEntity.Id,
TargetId = targetEntity.Id,
};
- _repositoryWrapper.RelatedFigureRepository.Create(relation);
+ await _repositoryWrapper.RelatedFigureRepository.CreateAsync(relation);
var resultIsSuccess = await _repositoryWrapper.SaveChangesAsync() > 0;
if(resultIsSuccess)
{
return Result.Ok(Unit.Value);
}
- else
- {
- string errorMsg = _stringLocalizerFailed["FailedToCreateRelation"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+
+ var finalErrorMsg = _stringLocalizerFailed["FailedToCreateRelation"].Value;
+ _logger.LogError(request, finalErrorMsg);
+ return Result.Fail(new Error(finalErrorMsg));
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Delete/DeleteRelatedFigureHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Delete/DeleteRelatedFigureHandler.cs
index 60f200b17..d63bb7de6 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Delete/DeleteRelatedFigureHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/Delete/DeleteRelatedFigureHandler.cs
@@ -29,13 +29,13 @@ public DeleteRelatedFigureHandler(
public async Task> Handle(DeleteRelatedFigureCommand request, CancellationToken cancellationToken)
{
var relation = await _repositoryWrapper.RelatedFigureRepository
- .GetFirstOrDefaultAsync(rel =>
- rel.ObserverId == request.ObserverId &&
- rel.TargetId == request.TargetId);
+ .GetFirstOrDefaultAsync(rel =>
+ rel.ObserverId == request.ObserverId &&
+ rel.TargetId == request.TargetId);
if (relation is null)
{
- string errorMsg = _stringLocalizerCannotFind["CannotFindRelationBetweenStreetcodesWithCorrespondingIds", request.ObserverId, request.TargetId].Value;
+ var errorMsg = _stringLocalizerCannotFind["CannotFindRelationBetweenStreetcodesWithCorrespondingIds", request.ObserverId, request.TargetId].Value;
_logger.LogError(request, errorMsg);
return Result.Fail(new Error(errorMsg));
}
@@ -47,11 +47,9 @@ public async Task> Handle(DeleteRelatedFigureCommand request, Cance
{
return Result.Ok(Unit.Value);
}
- else
- {
- string errorMsg = _stringLocalizerFailedToDelete["FailedToDeleteRelation"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+
+ var finalErrorMsg = _stringLocalizerFailedToDelete["FailedToDeleteRelation"].Value;
+ _logger.LogError(request, finalErrorMsg);
+ return Result.Fail(new Error(finalErrorMsg));
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdHandler.cs
index bf4687d1e..fea4ded80 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdHandler.cs
@@ -3,65 +3,64 @@
using FluentResults;
using MediatR;
using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Localization;
using Streetcode.BLL.DTO.Streetcode.RelatedFigure;
-using Streetcode.DAL.Entities.Streetcode;
using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.SharedResource;
+using Streetcode.DAL.Enums;
using Streetcode.DAL.Repositories.Interfaces.Base;
namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.GetByStreetcodeId;
-public class GetRelatedFiguresByStreetcodeIdHandler : IRequestHandler?>>
+public class GetRelatedFiguresByStreetcodeIdHandler : IRequestHandler>>
{
private readonly IMapper _mapper;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotFind;
- public GetRelatedFiguresByStreetcodeIdHandler(IMapper mapper, IRepositoryWrapper repositoryWrapper, ILoggerService logger, IStringLocalizer stringLocalizerCannotFind)
+ public GetRelatedFiguresByStreetcodeIdHandler(
+ IMapper mapper,
+ IRepositoryWrapper repositoryWrapper,
+ ILoggerService logger)
{
_mapper = mapper;
_repositoryWrapper = repositoryWrapper;
_logger = logger;
- _stringLocalizerCannotFind = stringLocalizerCannotFind;
}
// If you use Rider instead of Visual Studio, for example, "SuppressMessage" attribute suppresses PossibleMultipleEnumeration warning
[SuppressMessage("ReSharper", "PossibleMultipleEnumeration", Justification = "Here is no sense to do materialization of query because of nested ToListAsync method in GetAllAsync method")]
- public async Task?>> Handle(GetRelatedFigureByStreetcodeIdQuery request, CancellationToken cancellationToken)
+ public async Task>> Handle(GetRelatedFigureByStreetcodeIdQuery request, CancellationToken cancellationToken)
{
var relatedFigureIds = GetRelatedFigureIdsByStreetcodeId(request.StreetcodeId);
if (!relatedFigureIds.Any())
{
- string message = "Returning empty enumerable of related figures";
+ const string message = "Returning empty enumerable of related figures";
_logger.LogInformation(message);
return Result.Ok(Enumerable.Empty());
}
var relatedFigures = await _repositoryWrapper.StreetcodeRepository.GetAllAsync(
- predicate: sc => relatedFigureIds.Any(id => id == sc.Id) && sc.Status == DAL.Enums.StreetcodeStatus.Published,
- include: scl => scl.Include(sc => sc.Images).ThenInclude(img => img.ImageDetails)
- .Include(sc => sc.Tags));
+ predicate: sc => relatedFigureIds.Any(id => id == sc.Id) && sc.Status == StreetcodeStatus.Published,
+ include: scl => scl
+ .Include(sc => sc.Images)
+ .ThenInclude(img => img.ImageDetails)
+ .Include(sc => sc.Tags));
- if (!relatedFigures.Any())
+ if (!relatedFigureIds.Any())
{
- string errorMsg = _stringLocalizerCannotFind["CannotFindAnyRelatedFiguresByStreetcodeId", request.StreetcodeId].Value;
- _logger.LogError(request, errorMsg);
-
- return Result.Fail(new Error(errorMsg));
+ const string message = "Returning empty enumerable of related figures";
+ _logger.LogInformation(message);
+ return Result.Ok(Enumerable.Empty());
}
- foreach(StreetcodeContent streetcode in relatedFigures)
+ foreach(var streetcode in relatedFigures)
{
- if(streetcode.Images != null)
- {
- streetcode.Images = streetcode.Images.OrderBy(img => img.ImageDetails?.Alt).ToList();
- }
+ streetcode.Images = streetcode.Images.OrderBy(img => img.ImageDetails?.Alt).ToList();
}
- return Result.Ok?>(_mapper.Map>(relatedFigures));
+ var relatedFigureDto = _mapper.Map>(relatedFigures);
+
+ return Result.Ok(relatedFigureDto);
}
private IQueryable GetRelatedFigureIdsByStreetcodeId(int streetcodeId)
@@ -69,7 +68,7 @@ private IQueryable GetRelatedFigureIdsByStreetcodeId(int streetcodeId)
try
{
var observerIds = _repositoryWrapper.RelatedFigureRepository
- .FindAll(f => f.TargetId == streetcodeId).Select(o => o.ObserverId);
+ .FindAll(f => f.TargetId == streetcodeId).Select(o => o.ObserverId);
var targetIds = _repositoryWrapper.RelatedFigureRepository
.FindAll(f => f.ObserverId == streetcodeId).Select(t => t.TargetId);
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdQuery.cs
index 5cb595066..bd4fd3b21 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdQuery.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByStreetcodeId/GetRelatedFiguresByStreetcodeIdQuery.cs
@@ -5,4 +5,4 @@
namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.GetByStreetcodeId;
public record GetRelatedFigureByStreetcodeIdQuery(int StreetcodeId)
- : IRequest?>>;
+ : IRequest>>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdHandler.cs
index 1cecf410e..a82fb5206 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdHandler.cs
@@ -3,57 +3,61 @@
using FluentResults;
using MediatR;
using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Localization;
using Streetcode.BLL.DTO.Streetcode.RelatedFigure;
using Streetcode.BLL.Interfaces.Logging;
-using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
using Streetcode.DAL.Enums;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.GetByTagId
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.GetByTagId;
+
+public class GetRelatedFiguresByTagIdHandler : IRequestHandler>>
{
- internal class GetRelatedFiguresByTagIdHandler : IRequestHandler?>>
- {
- private readonly IMapper _mapper;
- private readonly IRepositoryWrapper _repositoryWrapper;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotFind;
+ private readonly IMapper _mapper;
+ private readonly IRepositoryWrapper _repositoryWrapper;
+ private readonly ILoggerService _logger;
- public GetRelatedFiguresByTagIdHandler(IRepositoryWrapper repositoryWrapper, IMapper mapper, ILoggerService logger, IStringLocalizer stringLocalizerCannotFind)
- {
- _repositoryWrapper = repositoryWrapper;
- _mapper = mapper;
- _logger = logger;
- _stringLocalizerCannotFind = stringLocalizerCannotFind;
- }
+ public GetRelatedFiguresByTagIdHandler(
+ IRepositoryWrapper repositoryWrapper,
+ IMapper mapper,
+ ILoggerService logger)
+ {
+ _repositoryWrapper = repositoryWrapper;
+ _mapper = mapper;
+ _logger = logger;
+ }
- // If you use Rider instead of Visual Studio, for example, "SuppressMessage" attribute suppresses PossibleMultipleEnumeration warning
- [SuppressMessage("ReSharper", "PossibleMultipleEnumeration", Justification = "Here is no sense to do materialization of query because of nested ToListAsync method in GetAllAsync method")]
- public async Task?>> Handle(GetRelatedFiguresByTagIdQuery request, CancellationToken cancellationToken)
- {
- var streetcodes = await _repositoryWrapper.StreetcodeRepository
- .GetAllAsync(
- predicate: sc => sc.Status == DAL.Enums.StreetcodeStatus.Published &&
- sc.Tags.Select(t => t.Id).Any(tag => tag == request.TagId),
+ // If you use Rider instead of Visual Studio, for example, "SuppressMessage" attribute suppresses PossibleMultipleEnumeration warning
+ [SuppressMessage("ReSharper", "PossibleMultipleEnumeration", Justification = "Here is no sense to do materialization of query because of nested ToListAsync method in GetAllAsync method")]
+ public async Task>> Handle(GetRelatedFiguresByTagIdQuery request, CancellationToken cancellationToken)
+ {
+ var streetcodes = await _repositoryWrapper.StreetcodeRepository
+ .GetAllAsync(
+ predicate: sc => sc.Status == StreetcodeStatus.Published &&
+ sc.Tags
+ .Select(t => t.Id)
+ .Any(tag => tag == request.TagId),
include: scl => scl
- .Include(sc => sc.Images).ThenInclude(x => x.ImageDetails)
+ .Include(sc => sc.Images)
+ .ThenInclude(x => x.ImageDetails)
.Include(sc => sc.Tags));
- const int blackAndWhiteImageAssignmentKey = (int)ImageAssigment.Blackandwhite;
- foreach (var streetcode in streetcodes)
- {
- streetcode.Images = streetcode.Images.Where(x => x.ImageDetails != null && x.ImageDetails.Alt!.Equals(blackAndWhiteImageAssignmentKey.ToString())).ToList();
- }
+ if (!streetcodes.Any())
+ {
+ const string message = "Returning empty enumerable of related figures";
+ _logger.LogInformation(message);
+ return Result.Ok(Enumerable.Empty());
+ }
- if (!streetcodes.Any())
- {
- string errorMsg = _stringLocalizerCannotFind["CannotFindAnyFactWithCorrespondingId", request.TagId].Value;
- _logger.LogError(request, errorMsg);
+ const int blackAndWhiteImageAssignmentKey = (int)ImageAssigment.Blackandwhite;
+ foreach (var streetcode in streetcodes)
+ {
+ streetcode.Images = streetcode.Images
+ .Where(x => x.ImageDetails != null && x.ImageDetails.Alt!.Equals(blackAndWhiteImageAssignmentKey.ToString()))
+ .ToList();
+ }
- return Result.Ok?>(null);
- }
+ var relatedFigureDtos = _mapper.Map>(streetcodes);
- return Result.Ok?>(_mapper.Map>(streetcodes));
- }
+ return Result.Ok(relatedFigureDtos);
}
-}
+}
\ No newline at end of file
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdQuery.cs
index 02dfc35e1..46642c4ab 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdQuery.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedFigure/GetByTagId/GetRelatedFiguresByTagIdQuery.cs
@@ -5,5 +5,5 @@
namespace Streetcode.BLL.MediatR.Streetcode.RelatedFigure.GetByTagId
{
public record GetRelatedFiguresByTagIdQuery(int TagId)
- : IRequest?>>;
+ : IRequest>>;
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermCommand.cs
index 877294e4f..3c9c1d1b4 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermCommand.cs
@@ -2,8 +2,7 @@
using MediatR;
using Streetcode.BLL.DTO.Streetcode.TextContent;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Create
-{
- public record CreateRelatedTermCommand(RelatedTermCreateDTO RelatedTerm)
- : IRequest>;
-}
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Create;
+
+public record CreateRelatedTermCommand(RelatedTermCreateDTO RelatedTerm)
+ : IRequest>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermHandler.cs
index 25e4bc7bb..e24cbf014 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Create/CreateRelatedTermHandler.cs
@@ -6,84 +6,78 @@
using Streetcode.BLL.Interfaces.Logging;
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
+using RelatedTermEntity = Streetcode.DAL.Entities.Streetcode.TextContent.RelatedTerm;
-using Entity = Streetcode.DAL.Entities.Streetcode.TextContent.RelatedTerm;
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Create;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Create
+public class CreateRelatedTermHandler : IRequestHandler>
{
- public class CreateRelatedTermHandler : IRequestHandler>
+ private readonly IRepositoryWrapper _repository;
+ private readonly IMapper _mapper;
+ private readonly ILoggerService _logger;
+ private readonly IStringLocalizer _stringLocalizerCannotCreate;
+ private readonly IStringLocalizer _stringLocalizerCannotSave;
+ private readonly IStringLocalizer _stringLocalizerCannotMap;
+ private readonly IStringLocalizer _stringLocalizer;
+
+ public CreateRelatedTermHandler(
+ IRepositoryWrapper repository,
+ IMapper mapper,
+ ILoggerService logger,
+ IStringLocalizer stringLocalizerCannotSave,
+ IStringLocalizer stringLocalizerCannotMap,
+ IStringLocalizer stringLocalizer,
+ IStringLocalizer stringLocalizerCannotCreate)
{
- private readonly IRepositoryWrapper _repository;
- private readonly IMapper _mapper;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotCreate;
- private readonly IStringLocalizer _stringLocalizerCannotSave;
- private readonly IStringLocalizer _stringLocalizerCannotMap;
- private readonly IStringLocalizer _stringLocalizer;
+ _repository = repository;
+ _mapper = mapper;
+ _logger = logger;
+ _stringLocalizerCannotSave = stringLocalizerCannotSave;
+ _stringLocalizerCannotMap = stringLocalizerCannotMap;
+ _stringLocalizer = stringLocalizer;
+ _stringLocalizerCannotCreate = stringLocalizerCannotCreate;
+ }
- public CreateRelatedTermHandler(
- IRepositoryWrapper repository,
- IMapper mapper,
- ILoggerService logger,
- IStringLocalizer stringLocalizerCannotSave,
- IStringLocalizer stringLocalizerCannotMap,
- IStringLocalizer stringLocalizer,
- IStringLocalizer stringLocalizerCannotCreate)
- {
- _repository = repository;
- _mapper = mapper;
- _logger = logger;
- _stringLocalizerCannotSave = stringLocalizerCannotSave;
- _stringLocalizerCannotMap = stringLocalizerCannotMap;
- _stringLocalizer = stringLocalizer;
- _stringLocalizerCannotCreate = stringLocalizerCannotCreate;
- }
+ public async Task> Handle(CreateRelatedTermCommand request, CancellationToken cancellationToken)
+ {
+ var relatedTerm = _mapper.Map(request.RelatedTerm);
- public async Task> Handle(CreateRelatedTermCommand request, CancellationToken cancellationToken)
+ if (relatedTerm is null)
{
- var relatedTerm = _mapper.Map(request.RelatedTerm);
-
- if (relatedTerm is null)
- {
- string errorMsg = _stringLocalizerCannotCreate["CannotCreateNewRelatedWordForTerm"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- var existingTerms = await _repository.RelatedTermRepository
- .GetAllAsync(
- predicate: rt => rt.TermId == request.RelatedTerm.TermId && rt.Word == request.RelatedTerm.Word);
+ var errorMessage = _stringLocalizerCannotCreate["CannotCreateNewRelatedWordForTerm"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
+ }
- if (existingTerms is null || existingTerms.Any())
- {
- string errorMsg = _stringLocalizer["WordWithThisDefinitionAlreadyExists"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+ var existingTerms = await _repository.RelatedTermRepository
+ .GetAllAsync(x => x.TermId == request.RelatedTerm.TermId && x.Word == request.RelatedTerm.Word);
- var createdRelatedTerm = _repository.RelatedTermRepository.Create(relatedTerm);
+ if (existingTerms.Any())
+ {
+ var errorMessage = _stringLocalizer["WordWithThisDefinitionAlreadyExists"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
+ }
- var isSuccessResult = await _repository.SaveChangesAsync() > 0;
+ var createdRelatedTerm = await _repository.RelatedTermRepository.CreateAsync(relatedTerm);
+ var isSuccessResult = await _repository.SaveChangesAsync() > 0;
- if(!isSuccessResult)
- {
- string errorMsg = _stringLocalizerCannotSave["CannotSaveChangesInTheDatabaseAfterRelatedWordCreation"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+ if (!isSuccessResult)
+ {
+ var errorMessage = _stringLocalizerCannotSave["CannotSaveChangesInTheDatabaseAfterRelatedWordCreation"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
+ }
- var createdRelatedTermDTO = _mapper.Map(createdRelatedTerm);
+ var createdRelatedTermDTO = _mapper.Map(createdRelatedTerm);
- if(createdRelatedTermDTO != null)
- {
- return Result.Ok(createdRelatedTermDTO);
- }
- else
- {
- string errorMsg = _stringLocalizerCannotMap["CannotMapEntity"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+ if (createdRelatedTermDTO is null)
+ {
+ var errorMessage = _stringLocalizerCannotMap["CannotMapEntity"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
+
+ return Result.Ok(createdRelatedTermDTO);
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermCommand.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermCommand.cs
index 23e4a82c0..055424624 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermCommand.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermCommand.cs
@@ -2,8 +2,7 @@
using MediatR;
using Streetcode.BLL.DTO.Streetcode.TextContent;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Delete
-{
- public record DeleteRelatedTermCommand(string word)
- : IRequest>;
-}
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Delete;
+
+public record DeleteRelatedTermCommand(string Word)
+ : IRequest>;
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermHandler.cs
index e81da18b1..75e263364 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/Delete/DeleteRelatedTermHandler.cs
@@ -7,55 +7,52 @@
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Delete
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.Delete;
+
+public class DeleteRelatedTermHandler : IRequestHandler>
{
- public class DeleteRelatedTermHandler : IRequestHandler>
+ private readonly IRepositoryWrapper _repository;
+ private readonly IMapper _mapper;
+ private readonly ILoggerService _logger;
+ private readonly IStringLocalizer _stringLocalizerCannotFind;
+ private readonly IStringLocalizer _stringLocalizerFailedToDelete;
+
+ public DeleteRelatedTermHandler(
+ IRepositoryWrapper repository,
+ IMapper mapper,
+ ILoggerService logger,
+ IStringLocalizer stringLocalizerFailedToDelete,
+ IStringLocalizer stringLocalizerCannotFind)
+ {
+ _repository = repository;
+ _mapper = mapper;
+ _logger = logger;
+ _stringLocalizerFailedToDelete = stringLocalizerFailedToDelete;
+ _stringLocalizerCannotFind = stringLocalizerCannotFind;
+ }
+
+ public async Task> Handle(DeleteRelatedTermCommand request, CancellationToken cancellationToken)
{
- private readonly IRepositoryWrapper _repository;
- private readonly IMapper _mapper;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotFind;
- private readonly IStringLocalizer _stringLocalizerFailedToDelete;
-
- public DeleteRelatedTermHandler(
- IRepositoryWrapper repository,
- IMapper mapper,
- ILoggerService logger,
- IStringLocalizer stringLocalizerFailedToDelete,
- IStringLocalizer stringLocalizerCannotFind)
+ var relatedTerm = await _repository.RelatedTermRepository.GetFirstOrDefaultAsync(x => x.Word!.ToLower().Equals(request.Word.ToLower()));
+
+ if (relatedTerm is null)
{
- _repository = repository;
- _mapper = mapper;
- _logger = logger;
- _stringLocalizerFailedToDelete = stringLocalizerFailedToDelete;
- _stringLocalizerCannotFind = stringLocalizerCannotFind;
+ var errorMessage = _stringLocalizerCannotFind["CannotFindRelatedTermWithCorrespondingId", request.Word].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
- public async Task> Handle(DeleteRelatedTermCommand request, CancellationToken cancellationToken)
+ _repository.RelatedTermRepository.Delete(relatedTerm);
+ var resultIsSuccess = await _repository.SaveChangesAsync() > 0;
+ var relatedTermDto = _mapper.Map(relatedTerm);
+
+ if (!resultIsSuccess || relatedTermDto is null)
{
- var relatedTerm = await _repository.RelatedTermRepository.GetFirstOrDefaultAsync(rt => rt.Word!.ToLower().Equals(request.word.ToLower()));
-
- if (relatedTerm is null)
- {
- string errorMsg = _stringLocalizerCannotFind["CannotFindRelatedTermWithCorrespondingId", request.word].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
-
- _repository.RelatedTermRepository.Delete(relatedTerm);
-
- var resultIsSuccess = await _repository.SaveChangesAsync() > 0;
- var relatedTermDto = _mapper.Map(relatedTerm);
- if(resultIsSuccess && relatedTermDto != null)
- {
- return Result.Ok(relatedTermDto);
- }
- else
- {
- string errorMsg = _stringLocalizerFailedToDelete["FailedToDeleteRelatedTerm"].Value;
- _logger.LogError(request, errorMsg);
- return Result.Fail(new Error(errorMsg));
- }
+ var errorMessage = _stringLocalizerFailedToDelete["FailedToDeleteRelatedTerm"].Value;
+ _logger.LogError(request, errorMessage);
+ return Result.Fail(new Error(errorMessage));
}
+
+ return Result.Ok(relatedTermDto);
}
}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAll/GetAllRelatedTermsQuery.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAll/GetAllRelatedTermsQuery.cs
deleted file mode 100644
index 6f01cccf0..000000000
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAll/GetAllRelatedTermsQuery.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.GetAll
-{
- internal class GetAllRelatedTermsQuery
- {
- }
-}
diff --git a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAllByTermId/GetAllRelatedTermsByTermIdHandler.cs b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAllByTermId/GetAllRelatedTermsByTermIdHandler.cs
index 1c9f3ebf9..75b9cf0aa 100644
--- a/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAllByTermId/GetAllRelatedTermsByTermIdHandler.cs
+++ b/Streetcode/Streetcode.BLL/MediatR/Streetcode/RelatedTerm/GetAllByTermId/GetAllRelatedTermsByTermIdHandler.cs
@@ -8,54 +8,42 @@
using Streetcode.BLL.SharedResource;
using Streetcode.DAL.Repositories.Interfaces.Base;
-namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.GetAllByTermId
-{
- public record GetAllRelatedTermsByTermIdHandler : IRequestHandler>>
- {
- private readonly IMapper _mapper;
- private readonly IRepositoryWrapper _repository;
- private readonly ILoggerService _logger;
- private readonly IStringLocalizer _stringLocalizerCannotGet;
- private readonly IStringLocalizer _stringLocalizerCannotCreate;
-
- public GetAllRelatedTermsByTermIdHandler(
- IMapper mapper,
- IRepositoryWrapper repositoryWrapper,
- ILoggerService logger,
- IStringLocalizer stringLocalizerCannotGet,
- IStringLocalizer stringLocalizerCannotCreate)
- {
- _mapper = mapper;
- _repository = repositoryWrapper;
- _logger = logger;
- _stringLocalizerCannotCreate = stringLocalizerCannotCreate;
- _stringLocalizerCannotGet = stringLocalizerCannotGet;
- }
+namespace Streetcode.BLL.MediatR.Streetcode.RelatedTerm.GetAllByTermId;
- public async Task