diff --git a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/AccountController.cs b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/AccountController.cs index cf6c21e1f..e6bc126d7 100644 --- a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/AccountController.cs +++ b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/AccountController.cs @@ -12,6 +12,7 @@ using HwProj.Models.Roles; using HwProj.SolutionsService.Client; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace HwProj.APIGateway.API.Controllers @@ -89,6 +90,15 @@ public async Task GetUserData() return Ok(aggregatedResult); } + [HttpGet("getUserSummary")] + [Authorize] + [ProducesResponseType(typeof(AccountSummaryDto), (int)HttpStatusCode.OK)] + public async Task GetUserSummary() + { + var accountData = await AuthServiceClient.GetAccountSummary(UserId); + return Ok(accountData); + } + [HttpPost("register")] [ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)] public async Task Register(RegisterViewModel model) @@ -98,20 +108,66 @@ public async Task Register(RegisterViewModel model) } [HttpPost("login")] - [ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)] + [ProducesResponseType((int)HttpStatusCode.OK)] public async Task Login(LoginViewModel model) { var tokenMeta = await AuthServiceClient.Login(model).ConfigureAwait(false); - return Ok(tokenMeta); + if (!tokenMeta.Succeeded) + { + ClearTokenCookie(); + return Unauthorized(); + } + + Response.Cookies.Append("accessToken", tokenMeta.Value.AccessToken, + new CookieOptions + { + Expires = tokenMeta.Value.ExpiresIn, + HttpOnly = true, + Secure = false, + SameSite = SameSiteMode.Strict + }); + + return Ok(); } [Authorize] [HttpGet("refreshToken")] - [ProducesResponseType(typeof(Result), (int)HttpStatusCode.OK)] + [ProducesResponseType((int)HttpStatusCode.OK)] public async Task RefreshToken() { var tokenMeta = await AuthServiceClient.RefreshToken(UserId!); - return Ok(tokenMeta); + if (!tokenMeta.Succeeded) + { + ClearTokenCookie(); + return Unauthorized(); + } + + Response.Cookies.Append("accessToken", tokenMeta.Value.AccessToken, + new CookieOptions + { + Expires = tokenMeta.Value.ExpiresIn, + HttpOnly = true, + Secure = false, + SameSite = SameSiteMode.Strict + }); + + return Ok(); + } + + [HttpPost("logout")] + [ProducesResponseType((int)HttpStatusCode.OK)] + public IActionResult Logout() + { + ClearTokenCookie(); + return Ok(); + } + + private void ClearTokenCookie() + { + if (Request.Cookies.ContainsKey("accessToken")) + { + Response.Cookies.Delete("accessToken"); + } } [HttpPut("edit")] diff --git a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/ExpertsController.cs b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/ExpertsController.cs index 597159b8e..d14efc6d2 100644 --- a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/ExpertsController.cs +++ b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/ExpertsController.cs @@ -1,4 +1,5 @@ -using System.Net; +using System.IdentityModel.Tokens.Jwt; +using System.Net; using System.Threading.Tasks; using AutoMapper; using HwProj.AuthService.Client; @@ -9,6 +10,7 @@ using HwProj.Models.Result; using HwProj.Models.Roles; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; namespace HwProj.APIGateway.API.Controllers; @@ -68,6 +70,30 @@ public async Task Register(RegisterExpertViewModel model) public async Task Login(TokenCredentials credentials) { var result = await AuthServiceClient.LoginExpert(credentials).ConfigureAwait(false); + + if (!result.Succeeded) + { + if (Request.Cookies.ContainsKey("accessToken")) + { + Response.Cookies.Delete("accessToken"); + } + + return Unauthorized(result); + } + + var handler = new JwtSecurityTokenHandler(); + var jwt = handler.ReadJwtToken(credentials.AccessToken); + var expiresIn = jwt.ValidTo; + + Response.Cookies.Append("accessToken", credentials.AccessToken, + new CookieOptions + { + Expires = expiresIn, + HttpOnly = true, + Secure = false, + SameSite = SameSiteMode.Strict + }); + return Ok(result); } diff --git a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/SolutionsController.cs b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/SolutionsController.cs index 1ab2fe869..6a6c2251e 100644 --- a/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/SolutionsController.cs +++ b/HwProj.APIGateway/HwProj.APIGateway.API/Controllers/SolutionsController.cs @@ -327,7 +327,7 @@ await _coursesServiceClient.CreateCourseGroup(new CreateGroupViewModel(arrFullSt } [HttpPost("automated/{courseId}")] - [Authorize(Roles = Roles.LecturerOrExpertRole)] + [Authorize(Roles = Roles.LecturerOrExpertRole, AuthenticationSchemes = "JwtCookie, JwtBearer")] [ProducesResponseType(typeof(void), (int)HttpStatusCode.OK)] public async Task PostAutomatedSolution(PostAutomatedSolutionModel model, long courseId) { diff --git a/HwProj.APIGateway/HwProj.APIGateway.API/Startup.cs b/HwProj.APIGateway/HwProj.APIGateway.API/Startup.cs index ec49a65cd..a19f31610 100644 --- a/HwProj.APIGateway/HwProj.APIGateway.API/Startup.cs +++ b/HwProj.APIGateway/HwProj.APIGateway.API/Startup.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Text; using System.Text.Json.Serialization; +using System.Threading.Tasks; using HwProj.APIGateway.API.Filters; using HwProj.AuthService.Client; using HwProj.ContentService.Client; @@ -27,7 +29,7 @@ public Startup(IConfiguration configuration) Configuration = configuration; } - public IConfiguration Configuration { get; } + private IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services) { @@ -52,10 +54,10 @@ public void ConfigureServices(IServiceCollection services) services.AddAuthentication(options => { - options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultAuthenticateScheme = "JwtCookie"; + options.DefaultChallengeScheme = "JwtCookie"; }) - .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, x => + .AddJwtBearer("JwtCookie", x => { x.RequireHttpsMetadata = false; x.TokenValidationParameters = new TokenValidationParameters @@ -66,13 +68,42 @@ public void ConfigureServices(IServiceCollection services) ValidateLifetime = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(appSettings["SecurityKey"])), - ValidateIssuerSigningKey = true + ValidateIssuerSigningKey = true, + ClockSkew = TimeSpan.Zero + }; + x.Events = new JwtBearerEvents + { + OnMessageReceived = context => + { + context.Request.Cookies.TryGetValue("accessToken", out var accessToken); + + if (!string.IsNullOrEmpty(accessToken)) + { + context.Token = accessToken; + } + + return Task.CompletedTask; + } + }; + }) + .AddJwtBearer("JwtBearer", x => + { + x.RequireHttpsMetadata = false; + x.TokenValidationParameters = new TokenValidationParameters + { + ValidIssuer = "AuthService", + ValidateIssuer = true, + ValidateAudience = false, + ValidateLifetime = true, + IssuerSigningKey = + new SymmetricSecurityKey(Encoding.ASCII.GetBytes(appSettings["SecurityKey"])), + ValidateIssuerSigningKey = true, + ClockSkew = TimeSpan.Zero }; }); services.AddHttpClient(); services.AddHttpContextAccessor(); - services.AddAuthServiceClient(); services.AddCoursesServiceClient(); services.AddSolutionServiceClient(); @@ -92,14 +123,13 @@ public void Configure(IApplicationBuilder app, IHostEnvironment env) app.UseHsts(); app.UseRouting(); - app.UseAuthentication(); - app.UseAuthorization(); app.UseCors(x => x - .AllowAnyMethod() + .WithMethods("GET") .AllowAnyHeader() .SetIsOriginAllowed(_ => true) .AllowCredentials()); - + app.UseAuthentication(); + app.UseAuthorization(); app.UseEndpoints(x => x.MapControllers()); } diff --git a/HwProj.APIGateway/HwProj.APIGateway.Tests/APIGatewayAuthControllersTests.cs b/HwProj.APIGateway/HwProj.APIGateway.Tests/APIGatewayAuthControllersTests.cs new file mode 100644 index 000000000..617d01d4f --- /dev/null +++ b/HwProj.APIGateway/HwProj.APIGateway.Tests/APIGatewayAuthControllersTests.cs @@ -0,0 +1,356 @@ +using System.IdentityModel.Tokens.Jwt; +using System.Net; +using System.Net.Mail; +using System.Security.Claims; +using System.Text; +using AutoFixture; +using FluentAssertions; +using HwProj.Models.AuthService.DTO; +using HwProj.Models.AuthService.ViewModels; +using HwProj.Models.Result; +using Microsoft.IdentityModel.Tokens; +using Newtonsoft.Json; + +namespace HwProj.APIGateway.Tests +{ + public class Tests + { + private HttpClient _noCookieClient; + private HttpClient _cookieClient; + private HttpClient _authServiceClient; + private CookieContainer _cookieContainer; + private const string _devPassword = "devPassword"; + + [SetUp] + public void Setup() + { + const string address = "http://localhost:5000"; + const string authServiceAddress = "http://localhost:5001"; + + var handlerNoCookie = new HttpClientHandler() + { + UseCookies = false + }; + + _noCookieClient = new HttpClient(handlerNoCookie) + { + BaseAddress = new Uri(address) + }; + + _cookieContainer = new CookieContainer(); + var handlerWithCookie = new HttpClientHandler() + { + UseCookies = true, + CookieContainer = _cookieContainer + + }; + + _cookieClient = new HttpClient(handlerWithCookie) + { + BaseAddress = new Uri(address) + }; + + _authServiceClient = new HttpClient() + { + BaseAddress = new Uri(authServiceAddress) + }; + } + + private Claim[] ValidateToken(string token) + { + const string secret = "U8_.wpvk93fPWG() + .With(x => x.Email, new Fixture().Create().Address); + + return fixture.Create(); + } + + private static LoginViewModel GenerateLoginViewModel(RegisterViewModel model) + => new LoginViewModel + { + Email = model.Email, + Password = _devPassword, + RememberMe = false + }; + + private static LoginViewModel GenerateWrongLoginViewModel(RegisterViewModel model) + => new LoginViewModel + { + Email = model.Email, + Password = "wrongPassword", + RememberMe = false + }; + + private static async Task PostJsonAsync(HttpClient client, string url, object data) + { + var json = JsonConvert.SerializeObject(data); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + return await client.PostAsync(url, content); + } + + private static async Task GetJsonAsync(HttpClient client, string url) + => await client.GetAsync(url); + + private static async Task PutJsonAsync(HttpClient client, string url, object data) + { + var json = JsonConvert.SerializeObject(data); + var content = new StringContent(json, Encoding.UTF8, "application/json"); + return await client.PutAsync(url, content); + } + + private static async Task ReadJsonAsync(HttpResponseMessage response) + { + var json = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(json); + } + + private static async Task RetryUntilSuccess(Func> action) + { + var response = await action(); + for (int i = 0; i < 10; i++) + { + if (response.StatusCode == HttpStatusCode.OK) + { + break; + } + await Task.Delay(500); + response = await action(); + } + + return response; + } + + private static async Task ReadOkAsync(HttpResponseMessage response) + { + response.StatusCode.Should().Be(HttpStatusCode.OK); + var resultResponse = await ReadJsonAsync(response); + resultResponse.Succeeded.Should().BeTrue(); + } + + private static async Task ReadOkAsync(HttpResponseMessage response) + { + response.StatusCode.Should().Be(HttpStatusCode.OK); + var resultResponse = await ReadJsonAsync>(response); + resultResponse.Succeeded.Should().BeTrue(); + } + + [Test] + public async Task LoginCorrectDataShouldSetCookie() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + loginResponse.Headers.Contains("Set-Cookie").Should().BeTrue(); + var cookie = loginResponse.Headers.GetValues("Set-Cookie").First(); + cookie.Should().Contain("httponly"); + } + + [Test] + public async Task LoginIncorrectDataShouldNotSetCookie() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateWrongLoginViewModel(user); + var loginResponse = await PostJsonAsync(_cookieClient, "/api/Account/login", loginData); + + await Task.Delay(1000); + + loginResponse.StatusCode.Should().Be(HttpStatusCode.Unauthorized); + loginResponse.Headers.Contains("Set-Cookie").Should().BeFalse(); + } + + [Test] + public async Task GetUserSummaryShouldReturnsUser() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var summaryResponse = await GetJsonAsync(_cookieClient, "/api/Account/getUserSummary"); + var summary = await ReadJsonAsync(summaryResponse); + summary.Email.Should().Be(user.Email); + } + + [Test] + public async Task GetUserSummaryWithoutCookieShouldReturnsUnauthorized() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_noCookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var response = await GetJsonAsync(_noCookieClient, "/api/Account/getUserSummary"); + response.StatusCode.Should().Be(HttpStatusCode.Unauthorized); + } + + [Test] + public async Task LogoutShouldRemoveCookie() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var logoutResponse = await PostJsonAsync(_cookieClient, "/api/Account/logout", null); + + var cookie = _cookieContainer.GetCookies(new Uri("http://localhost:5000")); + var accessToken = cookie["accessToken"]?.Value; + accessToken.Should().BeNull(); + + var response = await GetJsonAsync(_cookieClient, "/api/Account/getUserSummary"); + response.StatusCode.Should().Be(HttpStatusCode.Unauthorized); + } + + [Test] + public async Task RefreshTokenShouldSetValidToken() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var newEmail = "new" + user.Email; + var editModel = new EditAccountViewModel + { + Name = user.Name, + Surname = user.Surname, + Email = newEmail, + }; + + var editResponse = await PutJsonAsync(_cookieClient, "/api/Account/edit", editModel); + await ReadOkAsync(editResponse); + + var beforeCookie = _cookieContainer.GetCookies(new Uri("http://localhost:5000")); + var accessTokenBefore = beforeCookie["accessToken"]?.Value; + + var refreshResponse = await GetJsonAsync(_cookieClient, "/api/Account/refreshToken"); + refreshResponse.StatusCode.Should().Be(HttpStatusCode.OK); + refreshResponse.Headers.Contains("Set-Cookie").Should().BeTrue(); + + var afterCookie = _cookieContainer.GetCookies(new Uri("http://localhost:5000")); + var accessTokenAfter = afterCookie["accessToken"]?.Value; + + var tokenClaims = ValidateToken(accessTokenAfter); + accessTokenBefore.Should().NotBe(accessTokenAfter); + tokenClaims[2].Value.Should().Be(newEmail); + } + + [Test] + public async Task ExpertLoginShouldReturnExpectedResult() + { + var lecturerData = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", lecturerData); + await ReadOkAsync(registerResponse); + + var inviteLecturerModel = new InviteLecturerViewModel + { + Email = lecturerData.Email + }; + + var lecturerInviteResponse = await PostJsonAsync(_authServiceClient, "api/account/inviteNewLecturer", inviteLecturerModel); + await ReadOkAsync(lecturerInviteResponse); + + var lecturerLoginData = GenerateLoginViewModel(lecturerData); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", lecturerLoginData)); + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var email = "expertFrom" + lecturerData.Email; + var model = new RegisterExpertViewModel + { + Name = "expertFrom" + lecturerData.Name, + Surname = "expertFrom" + lecturerData.Surname, + Email = email + }; + + var registerExpertResponse = await PostJsonAsync(_cookieClient, $"api/Experts/register", model); + await ReadOkAsync(registerExpertResponse); + + var getTokenResponse = await GetJsonAsync(_cookieClient, $"/api/Experts/getToken?expertEmail={email}"); + var tokenMeta = await ReadJsonAsync>(getTokenResponse); + tokenMeta.Succeeded.Should().BeTrue(); + + var logoutResponse = await PostJsonAsync(_cookieClient, "/api/Account/logout", null); + + var expertLoginResponse = await PostJsonAsync(_cookieClient, "/api/Experts/login", tokenMeta.Value); + expertLoginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var cookie = expertLoginResponse.Headers.GetValues("Set-Cookie").First(); + expertLoginResponse.Headers.Contains("Set-Cookie").Should().BeTrue(); + cookie.Should().Contain("httponly"); + + var protectedResponse = await PostJsonAsync(_cookieClient, "/api/Experts/SetProfileIsEdited", null); + await ReadOkAsync(protectedResponse); + } + + [Test] + public async Task AuthorizedEndpointShouldRequireRole() + { + var user = GenerateRegisterViewModel(); + var registerResponse = await PostJsonAsync(_cookieClient, "/api/Account/register", user); + await ReadOkAsync(registerResponse); + + var loginData = GenerateLoginViewModel(user); + var loginResponse = await RetryUntilSuccess(() => PostJsonAsync(_cookieClient, "/api/Account/login", loginData)); + loginResponse.StatusCode.Should().Be(HttpStatusCode.OK); + + var lecturerModel = new InviteLecturerViewModel + { + Email = "lecturer@mail.ru" + }; + + var summaryResponse = await GetJsonAsync(_cookieClient, "/api/Account/getUserSummary"); + var summary = await ReadJsonAsync(summaryResponse); + summary.Email.Should().Be(user.Email); + + var response = await PostJsonAsync(_cookieClient, "/api/Account/inviteNewLecturer", lecturerModel); + response.StatusCode.Should().Be(HttpStatusCode.Forbidden); + } + + [TearDown] + public void Dispose() + { + _noCookieClient.Dispose(); + _cookieClient.Dispose(); + _authServiceClient.Dispose(); + } + } +} \ No newline at end of file diff --git a/HwProj.APIGateway/HwProj.APIGateway.Tests/HwProj.APIGateway.Tests.csproj b/HwProj.APIGateway/HwProj.APIGateway.Tests/HwProj.APIGateway.Tests.csproj index 89dd6ef3f..51e8105f0 100644 --- a/HwProj.APIGateway/HwProj.APIGateway.Tests/HwProj.APIGateway.Tests.csproj +++ b/HwProj.APIGateway/HwProj.APIGateway.Tests/HwProj.APIGateway.Tests.csproj @@ -1,24 +1,30 @@  - netcoreapp2.2 - + net8.0 + latest + enable + enable false - - - + + + + + + + + + - - Never - + - - + + diff --git a/HwProj.APIGateway/HwProj.APIGateway.Tests/UnitTest1.cs b/HwProj.APIGateway/HwProj.APIGateway.Tests/UnitTest1.cs deleted file mode 100644 index e69de29bb..000000000 diff --git a/HwProj.AuthService/HwProj.AuthService.API/Controllers/AccountController.cs b/HwProj.AuthService/HwProj.AuthService.API/Controllers/AccountController.cs index 06e2bf26f..1d1e28d4a 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Controllers/AccountController.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Controllers/AccountController.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Net; using System.Threading.Tasks; @@ -10,6 +11,7 @@ using HwProj.Models.AuthService.ViewModels; using HwProj.Models.Result; using HwProj.Models.Roles; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using User = HwProj.AuthService.API.Models.User; @@ -45,6 +47,17 @@ public async Task GetUserDataById(string userId) : NotFound(); } + [HttpGet("getUserSummary/{userId}")] + [ProducesResponseType(typeof(AccountSummaryDto), (int)HttpStatusCode.OK)] + public async Task GetUserSummaryById(string userId) + { + var accountSummary = await _accountService.GetAccountSummaryAsync(userId).ConfigureAwait(false); + + return accountSummary != null + ? Ok(accountSummary) as IActionResult + : NotFound(); + } + [HttpGet("getUserDataByEmail/{email}")] [ProducesResponseType(typeof(AccountDataDto), (int)HttpStatusCode.OK)] public async Task GetUserDataByEmail(string email) diff --git a/HwProj.AuthService/HwProj.AuthService.API/Extensions/MappingExtensions.cs b/HwProj.AuthService/HwProj.AuthService.API/Extensions/MappingExtensions.cs index b9fb1d328..a259a09bf 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Extensions/MappingExtensions.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Extensions/MappingExtensions.cs @@ -19,5 +19,13 @@ public static AccountDataDto ToAccountDataDto(this User user, string role) user.CompanyName, user.Bio); } + + public static AccountSummaryDto ToAccountSummaryDto(this User user, string role) + { + return new AccountSummaryDto( + user.Id, + user.Email, + role); + } } } diff --git a/HwProj.AuthService/HwProj.AuthService.API/Models/IdentityContext.cs b/HwProj.AuthService/HwProj.AuthService.API/Models/IdentityContext.cs index 564a283e1..5dd93e157 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Models/IdentityContext.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Models/IdentityContext.cs @@ -6,7 +6,6 @@ namespace HwProj.AuthService.API.Models public sealed class IdentityContext : IdentityDbContext { public DbSet ExpertsData { get; set; } - public IdentityContext(DbContextOptions options) : base(options) { diff --git a/HwProj.AuthService/HwProj.AuthService.API/Services/AccountService.cs b/HwProj.AuthService/HwProj.AuthService.API/Services/AccountService.cs index 706886b30..20f8c4e28 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Services/AccountService.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Services/AccountService.cs @@ -59,12 +59,26 @@ private async Task GetAccountDataAsync(User user) return user.ToAccountDataDto(userRole); } + private async Task GetAccountSummaryAsync(User user) + { + if (user == null) return null; + var userRoles = await _userManager.GetRolesAsync(user); + var userRole = userRoles.FirstOrDefault() ?? Roles.StudentRole; + return user.ToAccountSummaryDto(userRole); + } + public async Task GetAccountDataAsync(string userId) { var user = await _userManager.FindByIdAsync(userId); return await GetAccountDataAsync(user); } + public async Task GetAccountSummaryAsync(string userId) + { + var user = await _userManager.FindByIdAsync(userId); + return await GetAccountSummaryAsync(user); + } + public async Task GetAccountsDataAsync(string[] userIds) { var users = await _aspUserManager.Users diff --git a/HwProj.AuthService/HwProj.AuthService.API/Services/AuthTokenService.cs b/HwProj.AuthService/HwProj.AuthService.API/Services/AuthTokenService.cs index 528a019ab..33e0aee30 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Services/AuthTokenService.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Services/AuthTokenService.cs @@ -40,7 +40,7 @@ public async Task GetTokenAsync(User user) var expiresIn = userRoles.FirstOrDefault() == Roles.ExpertRole ? GetExpertTokenExpiresIn(timeNow) : timeNow.AddMinutes(int.Parse(_configuration["ExpiresIn"])); - + var token = new JwtSecurityToken( issuer: _configuration["ApiName"], notBefore: timeNow, @@ -56,7 +56,8 @@ public async Task GetTokenAsync(User user) var tokenCredentials = new TokenCredentials { - AccessToken = _tokenHandler.WriteToken(token) + AccessToken = _tokenHandler.WriteToken(token), + ExpiresIn = expiresIn }; return tokenCredentials; @@ -80,16 +81,16 @@ public async Task> GetExpertTokenAsync(User expert) .Select(errors => errors.Description) .ToArray()); } - + var tokenCredentials = await GetTokenAsync(expert); var result = await _userManager.SetAuthenticationTokenAsync(expert, loginProvider, tokenName, tokenCredentials.AccessToken); if (result.Succeeded) return Result.Success(tokenCredentials); - + return Result.Failed(result.Errors.Select(errors => errors.Description) .ToArray()); } - + return Result.Success(new TokenCredentials { AccessToken = token diff --git a/HwProj.AuthService/HwProj.AuthService.API/Services/ExpertsService.cs b/HwProj.AuthService/HwProj.AuthService.API/Services/ExpertsService.cs index bc48b14b2..f0bced8c4 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Services/ExpertsService.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Services/ExpertsService.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using AutoMapper; @@ -107,31 +108,20 @@ public async Task LoginExpertAsync(TokenCredentials tokenCredentials) { var tokenClaims = _tokenService.GetTokenClaims(tokenCredentials); - if (tokenClaims.Role != Roles.ExpertRole) - { - return Result.Failed("Невалидный токен: пользователь не является экспертом"); - } - if (tokenClaims.Email is null) { return Result.Failed("Невалидный токен: пользователь не найден"); } var expert = await _userManager.FindByEmailAsync(tokenClaims.Email); - if (expert.Id != tokenClaims.Id) + if (expert is null) { return Result.Failed("Невалидный токен: пользователь не найден"); } - var tokenCredentialsResult = await _tokenService.GetExpertTokenAsync(expert); - if (!tokenCredentialsResult.Succeeded) - { - return Result.Failed(tokenCredentialsResult.Errors); - } - - if (tokenCredentials.AccessToken != tokenCredentialsResult.Value.AccessToken) - { - return Result.Failed("Невалидный токен"); + var roles = await _userManager.GetRolesAsync(expert); + if (!roles.Contains(Roles.ExpertRole)) { + return Result.Failed("Невалидный токен: пользователь не является экспертом"); } await _signInManager.SignInAsync(expert, false).ConfigureAwait(false); diff --git a/HwProj.AuthService/HwProj.AuthService.API/Services/IAccountService.cs b/HwProj.AuthService/HwProj.AuthService.API/Services/IAccountService.cs index ca7d3c1d4..c953f99ba 100644 --- a/HwProj.AuthService/HwProj.AuthService.API/Services/IAccountService.cs +++ b/HwProj.AuthService/HwProj.AuthService.API/Services/IAccountService.cs @@ -11,6 +11,7 @@ namespace HwProj.AuthService.API.Services public interface IAccountService { Task GetAccountDataAsync(string userId); + Task GetAccountSummaryAsync(string userId); Task GetAccountsDataAsync(string[] userIds); Task GetAccountDataByEmailAsync(string email); Task> RegisterUserAsync(RegisterDataDTO model); diff --git a/HwProj.AuthService/HwProj.AuthService.Client/AuthServiceClient.cs b/HwProj.AuthService/HwProj.AuthService.Client/AuthServiceClient.cs index bf2d29112..11b9c8ea0 100644 --- a/HwProj.AuthService/HwProj.AuthService.Client/AuthServiceClient.cs +++ b/HwProj.AuthService/HwProj.AuthService.Client/AuthServiceClient.cs @@ -33,6 +33,16 @@ public async Task GetAccountData(string userId) return await response.DeserializeAsync().ConfigureAwait(false); } + public async Task GetAccountSummary(string userId) + { + using var httpRequest = new HttpRequestMessage( + HttpMethod.Get, + _authServiceUri + $"api/account/getUserSummary/{userId}"); + + var response = await _httpClient.SendAsync(httpRequest); + return await response.DeserializeAsync().ConfigureAwait(false); + } + public async Task GetAccountDataByEmail(string email) { using var httpRequest = new HttpRequestMessage( diff --git a/HwProj.AuthService/HwProj.AuthService.Client/IAuthServiceClient.cs b/HwProj.AuthService/HwProj.AuthService.Client/IAuthServiceClient.cs index 63d678991..af454342e 100644 --- a/HwProj.AuthService/HwProj.AuthService.Client/IAuthServiceClient.cs +++ b/HwProj.AuthService/HwProj.AuthService.Client/IAuthServiceClient.cs @@ -9,6 +9,7 @@ namespace HwProj.AuthService.Client public interface IAuthServiceClient { Task GetAccountData(string userId); + Task GetAccountSummary(string userId); Task GetAccountDataByEmail(string email); Task GetAccountsData(string[] userId); Task> Register(RegisterViewModel model); diff --git a/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs b/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs index 404e38e43..4d5178c02 100644 --- a/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs +++ b/HwProj.AuthService/HwProj.AuthService.IntegrationTests/AuthServiceTests.cs @@ -24,10 +24,13 @@ namespace HwProj.AuthService.IntegrationTests { public class Tests { + private const string _testUserEmail = "admin@gmail.com"; + private const string _testUserPassword = "Admin@1234"; + private Claim[] ValidateToken(Result resultData) { - const string secret = "this is a string used for encrypt and decrypt token"; - var key = Encoding.ASCII.GetBytes(secret); + const string secret = "U8_.wpvk93fPWG resultData) ValidateIssuer = true, ValidateAudience = false, ValidateLifetime = true, - IssuerSigningKey = null, + IssuerSigningKey = key, ValidateIssuerSigningKey = true }; var claims = handler.ValidateToken(resultData.Value.AccessToken, validations, out var tokenSecure); @@ -60,12 +63,8 @@ private AuthServiceClient CreateAuthServiceClient() private static RegisterViewModel GenerateRegisterViewModel() { - var password = new Fixture().Create(); - var fixture = new Fixture().Build() .With(x => x.Email, new Fixture().Create().Address); - // .With(x => x.Password, password) - // .With(x => x.PasswordConfirm, password); return fixture.Create(); } @@ -74,7 +73,6 @@ private static LoginViewModel GenerateLoginViewModel(RegisterViewModel model) => new LoginViewModel { Email = model.Email, - // Password = model.Password, RememberMe = false }; @@ -187,7 +185,13 @@ public async Task TestLoginUser() var userData = GenerateRegisterViewModel(); await _authServiceClient.Register(userData); - var loginData = GenerateLoginViewModel(userData); + var loginData = new LoginViewModel + { + Email = _testUserEmail, + Password = _testUserPassword, + RememberMe = false, + }; + var resultData = await _authServiceClient.Login(loginData); resultData.Succeeded.Should().BeTrue(); @@ -195,11 +199,11 @@ public async Task TestLoginUser() resultData.Value.AccessToken.Should().NotBeNullOrEmpty(); var claims = ValidateToken(resultData); - var userId = await _authServiceClient.FindByEmailAsync(userData.Email); + var userId = await _authServiceClient.FindByEmailAsync(_testUserEmail); claims[1].Value.Should().Be(userId); - claims[2].Value.Should().Be(userData.Email); - claims[3].Value.Should().Be(Roles.StudentRole); + claims[2].Value.Should().Be(_testUserEmail); + claims[3].Value.Should().Be(Roles.LecturerRole); } [Test] diff --git a/HwProj.Common/HwProj.Models/AuthService/DTO/AccountSummaryDto.cs b/HwProj.Common/HwProj.Models/AuthService/DTO/AccountSummaryDto.cs new file mode 100644 index 000000000..118d6004a --- /dev/null +++ b/HwProj.Common/HwProj.Models/AuthService/DTO/AccountSummaryDto.cs @@ -0,0 +1,19 @@ +namespace HwProj.Models.AuthService.DTO +{ + public class AccountSummaryDto + { + public string UserId { get; set; } + public string Email { get; } + public string Role { get; } + + public AccountSummaryDto( + string userId, + string email, + string role) + { + UserId = userId; + Email = email; + Role = role; + } + } +} \ No newline at end of file diff --git a/HwProj.Common/HwProj.Models/AuthService/DTO/TokenCredentials.cs b/HwProj.Common/HwProj.Models/AuthService/DTO/TokenCredentials.cs index 8d0d8ad7f..24629578a 100644 --- a/HwProj.Common/HwProj.Models/AuthService/DTO/TokenCredentials.cs +++ b/HwProj.Common/HwProj.Models/AuthService/DTO/TokenCredentials.cs @@ -1,7 +1,10 @@ -namespace HwProj.Models.AuthService.DTO +using System; + +namespace HwProj.Models.AuthService.DTO { public class TokenCredentials { public string AccessToken { get; set; } + public DateTime ExpiresIn { get; set; } } } diff --git a/HwProj.Common/HwProj.Models/AuthService/ViewModels/EditAccountViewModel.cs b/HwProj.Common/HwProj.Models/AuthService/ViewModels/EditAccountViewModel.cs index 1198655af..930a63e7a 100644 --- a/HwProj.Common/HwProj.Models/AuthService/ViewModels/EditAccountViewModel.cs +++ b/HwProj.Common/HwProj.Models/AuthService/ViewModels/EditAccountViewModel.cs @@ -8,13 +8,13 @@ public class EditAccountViewModel [Required] public string Surname { get; set; } - public string MiddleName { get; set; } + public string? MiddleName { get; set; } [DataType(DataType.EmailAddress)] - public string Email { get; set; } + public string? Email { get; set; } - public string Bio { get; set; } - - public string CompanyName { get; set; } + public string? Bio { get; set; } + + public string? CompanyName { get; set; } } } \ No newline at end of file diff --git a/HwProj.Common/HwProj.Models/AuthService/ViewModels/RegisterExpertViewModel.cs b/HwProj.Common/HwProj.Models/AuthService/ViewModels/RegisterExpertViewModel.cs index 7ff7a0909..4614dd7ff 100644 --- a/HwProj.Common/HwProj.Models/AuthService/ViewModels/RegisterExpertViewModel.cs +++ b/HwProj.Common/HwProj.Models/AuthService/ViewModels/RegisterExpertViewModel.cs @@ -11,15 +11,15 @@ public class RegisterExpertViewModel [Required] public string Surname { get; set; } - public string MiddleName { get; set; } + public string? MiddleName { get; set; } [Required] [DataType(DataType.EmailAddress)] public string Email { get; set; } - public string Bio { get; set; } - - public string CompanyName { get; set; } + public string? Bio { get; set; } + + public string? CompanyName { get; set; } public List Tags { get; set; } = new List(); } diff --git a/HwProj.NotificationsService/HwProj.NotificationsService.API/EventHandlers/RegisterEventHandler.cs b/HwProj.NotificationsService/HwProj.NotificationsService.API/EventHandlers/RegisterEventHandler.cs index 322156d59..f2888e03e 100644 --- a/HwProj.NotificationsService/HwProj.NotificationsService.API/EventHandlers/RegisterEventHandler.cs +++ b/HwProj.NotificationsService/HwProj.NotificationsService.API/EventHandlers/RegisterEventHandler.cs @@ -1,7 +1,10 @@ using System; +using System.Linq; using System.Threading.Tasks; using System.Web; +using HwProj.AuthService.Client; using HwProj.EventBus.Client.Interfaces; +using HwProj.Models.AuthService.ViewModels; using HwProj.NotificationService.Events.AuthService; using HwProj.NotificationsService.API.Models; using HwProj.NotificationsService.API.Repositories; @@ -17,17 +20,21 @@ public class RegisterEventHandler : EventHandlerBase private readonly IEmailService _emailService; private readonly IConfiguration _configuration; private readonly bool _isDevelopmentEnv; + private readonly IAuthServiceClient _authServiceClient; + private const string _devPassword = "devPassword"; public RegisterEventHandler( INotificationsRepository notificationRepository, IEmailService emailService, IConfiguration configuration, - IHostingEnvironment env) + IHostingEnvironment env, + IAuthServiceClient authServiceClient) { _notificationRepository = notificationRepository; _emailService = emailService; _configuration = configuration; _isDevelopmentEnv = env.IsDevelopment(); + _authServiceClient = authServiceClient; } public override async Task HandleAsync(StudentRegisterEvent @event) @@ -36,6 +43,13 @@ public override async Task HandleAsync(StudentRegisterEvent @event) var recoveryLink = $"{frontendUrl}/resetPassword?token={HttpUtility.UrlEncode(@event.ChangePasswordToken)}&id={HttpUtility.UrlEncode(@event.UserId)}"; + if (_isDevelopmentEnv) + { + await HandleDevAsync(@event); + Console.WriteLine(recoveryLink); + return; + } + var notification = new Notification { Sender = "AuthService", @@ -48,11 +62,42 @@ public override async Task HandleAsync(StudentRegisterEvent @event) Owner = @event.UserId }; - if (_isDevelopmentEnv) Console.WriteLine(recoveryLink); var addNotificationTask = _notificationRepository.AddAsync(notification); var sendEmailTask = _emailService.SendEmailAsync(notification, @event.Email, "HwProj"); await Task.WhenAll(addNotificationTask, sendEmailTask); } + + private async Task HandleDevAsync(StudentRegisterEvent @event) + { + var resetModel = new ResetPasswordViewModel + { + UserId = @event.UserId, + Token = @event.ChangePasswordToken, + Password = _devPassword, + PasswordConfirm = _devPassword + }; + + for (var attempt = 0; attempt < 10; attempt++) + { + var result = await _authServiceClient.ResetPassword(resetModel); + if (result.Succeeded) + { + Console.WriteLine("Password changed"); + return; + } + + Console.WriteLine("Password not changed"); + var error = result.Errors.FirstOrDefault(); + + Console.WriteLine(error); + if (error is null || !error.Contains("Optimistic concurrency")) + { + return; + } + + await Task.Delay(500); + } + } } } diff --git a/HwProj.sln b/HwProj.sln index 6b9064aec..7769bfcb9 100644 --- a/HwProj.sln +++ b/HwProj.sln @@ -82,6 +82,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.NotificationService. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.Repositories.Net8", "HwProj.Common\HwProj.Repositories.Net8\HwProj.Repositories.Net8.csproj", "{9E3A99DA-6975-46A7-90DB-69B708C8FF2C}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HwProj.APIGateway.Tests", "HwProj.APIGateway\HwProj.APIGateway.Tests\HwProj.APIGateway.Tests.csproj", "{58C724C5-D05C-4F95-ACD1-1AF4190D49A4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -200,6 +202,10 @@ Global {9E3A99DA-6975-46A7-90DB-69B708C8FF2C}.Debug|Any CPU.Build.0 = Debug|Any CPU {9E3A99DA-6975-46A7-90DB-69B708C8FF2C}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E3A99DA-6975-46A7-90DB-69B708C8FF2C}.Release|Any CPU.Build.0 = Release|Any CPU + {58C724C5-D05C-4F95-ACD1-1AF4190D49A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58C724C5-D05C-4F95-ACD1-1AF4190D49A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58C724C5-D05C-4F95-ACD1-1AF4190D49A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58C724C5-D05C-4F95-ACD1-1AF4190D49A4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -233,6 +239,7 @@ Global {6D9F7095-5E38-4FC6-9913-C4015B233656} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} {C04A9D3D-B299-4534-B7B1-36DF92B1BC87} = {1EAEB779-E7C8-4EF9-B9A9-22CB8E3C246D} {9E3A99DA-6975-46A7-90DB-69B708C8FF2C} = {77D857A8-45C6-4432-B4BF-A2F2C9ECA7FE} + {58C724C5-D05C-4F95-ACD1-1AF4190D49A4} = {DC0D1EE7-D2F8-4D15-8CC6-69A0A0A938D9} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C03BF138-4A5B-4261-9495-6D3AC6CE9779} diff --git a/generate-swagger-client.ps1 b/generate-swagger-client.ps1 index 274c42f93..ab946ebb7 100644 Binary files a/generate-swagger-client.ps1 and b/generate-swagger-client.ps1 differ diff --git a/hwproj.front/package-lock.json b/hwproj.front/package-lock.json index 86b29a013..77485cf23 100644 --- a/hwproj.front/package-lock.json +++ b/hwproj.front/package-lock.json @@ -4975,6 +4975,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-6.5.16.tgz", "integrity": "sha512-p3DqQi+8QRL5k7jXhXmJZLsE/GqHqyY6PcoA1oNTJr0try48uhTGUOYkgzmqtDaa/qPFO5LP+xCPzZXckGtquQ==", + "dev": true, "license": "MIT", "dependencies": { "@storybook/api": "6.5.16", @@ -5002,12 +5003,14 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, "license": "MIT" }, "node_modules/@storybook/api": { "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/api/-/api-6.5.16.tgz", "integrity": "sha512-HOsuT8iomqeTMQJrRx5U8nsC7lJTwRr1DhdD0SzlqL4c80S/7uuCy4IZvOt4sYQjOzW5fOo/kamcoBXyLproTA==", + "dev": true, "license": "MIT", "dependencies": { "@storybook/channels": "6.5.16", @@ -5041,6 +5044,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, "license": "MIT" }, "node_modules/@storybook/builder-webpack4": { @@ -5439,6 +5443,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-6.5.16.tgz", "integrity": "sha512-VylzaWQZaMozEwZPJdyJoz+0jpDa8GRyaqu9TGG6QGv+KU5POoZaGLDkRE7TzWkyyP0KQLo80K99MssZCpgSeg==", + "dev": true, "license": "MIT", "dependencies": { "core-js": "^3.8.2", @@ -5498,6 +5503,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-6.5.16.tgz", "integrity": "sha512-pxcNaCj3ItDdicPTXTtmYJE3YC1SjxFrBmHcyrN+nffeNyiMuViJdOOZzzzucTUG0wcOOX8jaSyak+nnHg5H1Q==", + "dev": true, "license": "MIT", "dependencies": { "core-js": "^3.8.2", @@ -5512,6 +5518,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/components/-/components-6.5.16.tgz", "integrity": "sha512-LzBOFJKITLtDcbW9jXl0/PaG+4xAz25PK8JxPZpIALbmOpYWOAPcO6V9C2heX6e6NgWFMUxjplkULEk9RCQMNA==", + "dev": true, "license": "MIT", "dependencies": { "@storybook/client-logger": "6.5.16", @@ -5536,6 +5543,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, "license": "MIT" }, "node_modules/@storybook/core": { @@ -5702,6 +5710,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-6.5.16.tgz", "integrity": "sha512-qMZQwmvzpH5F2uwNUllTPg6eZXr2OaYZQRRN8VZJiuorZzDNdAFmiVWMWdkThwmyLEJuQKXxqCL8lMj/7PPM+g==", + "dev": true, "license": "MIT", "dependencies": { "core-js": "^3.8.2" @@ -5802,6 +5811,7 @@ "version": "0.0.2--canary.4566f4d.1", "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.0.2--canary.4566f4d.1.tgz", "integrity": "sha512-9OVvMVh3t9znYZwb0Svf/YQoxX2gVOeQTGe2bses2yj+a3+OJnCrUF3/hGv6Em7KujtOdL2LL+JnG49oMVGFgQ==", + "dev": true, "license": "MIT", "dependencies": { "lodash": "^4.17.15" @@ -6274,6 +6284,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/router/-/router-6.5.16.tgz", "integrity": "sha512-ZgeP8a5YV/iuKbv31V8DjPxlV4AzorRiR8OuSt/KqaiYXNXlOoQDz/qMmiNcrshrfLpmkzoq7fSo4T8lWo2UwQ==", + "dev": true, "license": "MIT", "dependencies": { "@storybook/client-logger": "6.5.16", @@ -6295,12 +6306,14 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, "license": "MIT" }, "node_modules/@storybook/semver": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/@storybook/semver/-/semver-7.3.2.tgz", "integrity": "sha512-SWeszlsiPsMI0Ps0jVNtH64cI5c0UF3f7KgjVKJoNP30crQ6wUSddY2hsdeczZXEKVJGEn50Q60flcGsQGIcrg==", + "dev": true, "license": "ISC", "dependencies": { "core-js": "^3.6.5", @@ -6317,6 +6330,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", @@ -6330,6 +6344,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" @@ -6342,6 +6357,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" @@ -6357,6 +6373,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" @@ -6440,6 +6457,7 @@ "version": "6.5.16", "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-6.5.16.tgz", "integrity": "sha512-hNLctkjaYLRdk1+xYTkC1mg4dYz2wSv6SqbLpcKMbkPHTE0ElhddGPHQqB362md/w9emYXNkt1LSMD8Xk9JzVQ==", + "dev": true, "license": "MIT", "dependencies": { "@storybook/client-logger": "6.5.16", @@ -6460,6 +6478,7 @@ "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "dev": true, "license": "MIT" }, "node_modules/@storybook/ui": { @@ -7086,6 +7105,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/is-function/-/is-function-1.0.3.tgz", "integrity": "sha512-/CLhCW79JUeLKznI6mbVieGbl4QU5Hfn+6udw1YHZoofASjbQ5zaP5LzAUZYDpRYEjS4/P+DhEgyJ/PQmGGTWw==", + "dev": true, "license": "MIT" }, "node_modules/@types/isomorphic-fetch": { @@ -7454,6 +7474,7 @@ "version": "1.18.8", "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.18.8.tgz", "integrity": "sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==", + "dev": true, "license": "MIT" }, "node_modules/@types/webpack-sources": { @@ -18001,6 +18022,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==", + "dev": true, "license": "MIT" }, "node_modules/is-generator-function": { @@ -18123,6 +18145,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -18200,6 +18223,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -18671,13 +18695,6 @@ "node": ">= 10.13.0" } }, - "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", - "license": "MIT", - "peer": true - }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -19317,6 +19334,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", "integrity": "sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==", + "dev": true, "license": "MIT" }, "node_modules/map-visit": { @@ -20509,6 +20527,7 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, "license": "MIT", "dependencies": { "map-or-similar": "^1.5.0" @@ -20565,21 +20584,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-descriptors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", @@ -22490,6 +22494,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -22692,6 +22697,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -22844,18 +22850,6 @@ "node": ">=6" } }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "license": "MIT", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/portable-fetch": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/portable-fetch/-/portable-fetch-3.0.0.tgz", @@ -27150,6 +27144,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", @@ -28026,6 +28021,7 @@ "version": "2.14.4", "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.4.tgz", "integrity": "sha512-srTItn1GOvyvOycgxjAnPA63FZNwy0PTyUBFMHRM+hVFltAeoh0LmNBz9SZqUS9mMqGk8rfyWyXn3GH5ReJ8Zw==", + "dev": true, "license": "MIT" }, "node_modules/stream-browserify": { @@ -28659,6 +28655,7 @@ "version": "6.0.8", "resolved": "https://registry.npmjs.org/telejson/-/telejson-6.0.8.tgz", "integrity": "sha512-nerNXi+j8NK1QEfBHtZUN/aLdDcyupA//9kAboYLrtzZlPLpUfqbVGWb9zz91f/mIjRbAYhbgtnJHY8I1b5MBg==", + "dev": true, "license": "MIT", "dependencies": { "@types/is-function": "^1.0.0", @@ -28675,6 +28672,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -29196,6 +29194,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.10" @@ -30088,6 +30087,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, "license": "MIT" }, "node_modules/util.promisify": { @@ -31943,21 +31943,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", - "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/hwproj.front/src/App.tsx b/hwproj.front/src/App.tsx index 359f29fa3..1583ab806 100644 --- a/hwproj.front/src/App.tsx +++ b/hwproj.front/src/App.tsx @@ -32,7 +32,8 @@ interface AppState { isLecturer: boolean; isExpert: boolean; newNotificationsCount: number; - appBarContextAction: AppBarContextAction + appBarContextAction: AppBarContextAction; + authReady: boolean; } const withRouter = (Component: any) => { @@ -52,21 +53,32 @@ class App extends Component<{ navigate: any }, AppState> { constructor(props: { navigate: any }) { super(props); this.state = { - loggedIn: ApiSingleton.authService.isLoggedIn(), + loggedIn: ApiSingleton.authService.loggedIn(), isLecturer: ApiSingleton.authService.isLecturer(), isExpert: ApiSingleton.authService.isExpert(), newNotificationsCount: 0, - appBarContextAction: "Default" + appBarContextAction: "Default", + authReady: false }; appBarStateManager.setOnContextActionChange(appBarState => this.setState({appBarContextAction: appBarState})) } componentDidMount = async () => { + const user = await ApiSingleton.authService.getProfile(); + this.setState( + { + loggedIn: !!user, + isLecturer: ApiSingleton.authService.isLecturer(), + isExpert: ApiSingleton.authService.isExpert(), + authReady: true, + } + ); + await this.updatedNewNotificationsCount() } updatedNewNotificationsCount = async () => { - if (ApiSingleton.authService.isLoggedIn()) { + if (ApiSingleton.authService.loggedIn()) { const data = await ApiSingleton.notificationsApi.notificationsGetNewNotificationsCount() this.setState({newNotificationsCount: data}) } @@ -86,13 +98,14 @@ class App extends Component<{ navigate: any }, AppState> { } } - logout = () => { - ApiSingleton.authService.logout(); - this.setState({loggedIn: false, isLecturer: false, isExpert: false, newNotificationsCount: 0}); + logout = async () => { + await ApiSingleton.authService.logout(); + this.setState({loggedIn: false, isLecturer: false, isExpert: false, newNotificationsCount: 0, authReady: true}); this.props.navigate("/login"); } render() { + if (!this.state.authReady) {return null;} return ( <>
- ApiSingleton.authService.isLoggedIn() + ApiSingleton.authService.loggedIn() ? : diff --git a/hwproj.front/src/api/ApiSingleton.ts b/hwproj.front/src/api/ApiSingleton.ts index df3527ba0..889f08b6c 100644 --- a/hwproj.front/src/api/ApiSingleton.ts +++ b/hwproj.front/src/api/ApiSingleton.ts @@ -14,7 +14,6 @@ import AuthService from "../services/AuthService"; import CustomFilesApi from "./CustomFilesApi"; class Api { - auth = new AuthService() readonly accountApi: AccountApi; readonly expertsApi: ExpertsApi; readonly coursesApi: CoursesApi; @@ -70,22 +69,53 @@ function getApiBase(): string { return `${protocol}//${hostname}${effectivePort ? `:${effectivePort}` : ""}` } +const cookieFetch = async (url: string, init: any) => { + const response = await fetch(url, { + ...init, + credentials: "include" + }); + + const path = window.location.pathname; + + if (response.status === 401 && + !path.includes("login") && + !path.includes("register")){ + window.location.href = `/login?returnUrl=${window.location.pathname}`; + } + + return response; +} + +const cookieFetchWithoutRedirect = async (url: string, init: any) => { + const response = await fetch(url, { + ...init, + credentials: "include" + }); + + return response; +} + const basePath = getApiBase() const authService = new AuthService() +const apiConfig = { + basePath: basePath, +} + +export const accountApiWithoutRedirect = new AccountApi(apiConfig, undefined, cookieFetchWithoutRedirect); let ApiSingleton: Api; ApiSingleton = new Api( - new AccountApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new ExpertsApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new CoursesApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new SolutionsApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new NotificationsApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new HomeworksApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new TasksApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new StatisticsApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new SystemApi({basePath: basePath}), + new AccountApi(apiConfig, undefined, cookieFetch), + new ExpertsApi(apiConfig, undefined, cookieFetch), + new CoursesApi(apiConfig, undefined, cookieFetch), + new SolutionsApi(apiConfig, undefined, cookieFetch), + new NotificationsApi(apiConfig, undefined, cookieFetch), + new HomeworksApi(apiConfig, undefined, cookieFetch), + new TasksApi(apiConfig, undefined, cookieFetch), + new StatisticsApi(apiConfig, undefined, cookieFetch), + new SystemApi(apiConfig, undefined, cookieFetch), authService, - new CustomFilesApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}), - new FilesApi({basePath: basePath, apiKey: () => "Bearer " + authService.getToken()!}) + new CustomFilesApi(apiConfig, undefined, cookieFetch), + new FilesApi(apiConfig, undefined, cookieFetch) ); export default ApiSingleton; \ No newline at end of file diff --git a/hwproj.front/src/api/api.ts b/hwproj.front/src/api/api.ts index 980dcc406..b8737cb93 100644 --- a/hwproj.front/src/api/api.ts +++ b/hwproj.front/src/api/api.ts @@ -1,4 +1,4 @@ -/// +/// // tslint:disable /** * API Gateway @@ -144,6 +144,31 @@ export interface AccountDataDto { */ companyName?: string; } +/** + * + * @export + * @interface AccountSummaryDto + */ +export interface AccountSummaryDto { + /** + * + * @type {string} + * @memberof AccountSummaryDto + */ + userId?: string; + /** + * + * @type {string} + * @memberof AccountSummaryDto + */ + email?: string; + /** + * + * @type {string} + * @memberof AccountSummaryDto + */ + role?: string; +} /** * * @export @@ -2594,6 +2619,12 @@ export interface TokenCredentials { * @memberof TokenCredentials */ accessToken?: string; + /** + * + * @type {Date} + * @memberof TokenCredentials + */ + expiresIn?: Date; } /** * @@ -2871,14 +2902,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (code !== undefined) { localVarQueryParameter['code'] = code; } @@ -2906,14 +2929,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -2940,14 +2955,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -2971,14 +2978,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3005,14 +3004,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -3041,13 +3032,27 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountGetUserSummary(options: any = {}): FetchArgs { + const localVarPath = `/api/Account/getUserSummary`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions = Object.assign({ method: 'GET' }, options); + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 @@ -3072,14 +3077,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3107,14 +3104,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3129,6 +3118,28 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati options: localVarRequestOptions, }; }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountLogout(options: any = {}): FetchArgs { + const localVarPath = `/api/Account/logout`; + const localVarUrlObj = url.parse(localVarPath, true); + const localVarRequestOptions = Object.assign({ method: 'POST' }, options); + const localVarHeaderParameter = {} as any; + const localVarQueryParameter = {} as any; + + localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); + // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 + localVarUrlObj.search = null; + localVarRequestOptions.headers = Object.assign({}, localVarHeaderParameter, options.headers); + + return { + url: url.format(localVarUrlObj), + options: localVarRequestOptions, + }; + }, /** * * @param {*} [options] Override http request option. @@ -3141,14 +3152,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -3172,14 +3175,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3207,14 +3202,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3242,14 +3229,6 @@ export const AccountApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3379,6 +3358,23 @@ export const AccountApiFp = function(configuration?: Configuration) { }); }; }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountGetUserSummary(options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + const localVarFetchArgs = AccountApiFetchParamCreator(configuration).accountGetUserSummary(options); + return (fetch: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response.json(); + } else { + throw response; + } + }); + }; + }, /** * * @param {InviteLecturerViewModel} [body] @@ -3403,12 +3399,12 @@ export const AccountApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - accountLogin(body?: LoginViewModel, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + accountLogin(body?: LoginViewModel, options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { const localVarFetchArgs = AccountApiFetchParamCreator(configuration).accountLogin(body, options); return (fetch: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { if (response.status >= 200 && response.status < 300) { - return response.json(); + return response; } else { throw response; } @@ -3420,12 +3416,29 @@ export const AccountApiFp = function(configuration?: Configuration) { * @param {*} [options] Override http request option. * @throws {RequiredError} */ - accountRefreshToken(options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + accountLogout(options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { + const localVarFetchArgs = AccountApiFetchParamCreator(configuration).accountLogout(options); + return (fetch: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { + return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { + if (response.status >= 200 && response.status < 300) { + return response; + } else { + throw response; + } + }); + }; + }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountRefreshToken(options?: any): (fetch?: FetchAPI, basePath?: string) => Promise { const localVarFetchArgs = AccountApiFetchParamCreator(configuration).accountRefreshToken(options); return (fetch: FetchAPI = isomorphicFetch, basePath: string = BASE_PATH) => { return fetch(basePath + localVarFetchArgs.url, localVarFetchArgs.options).then((response) => { if (response.status >= 200 && response.status < 300) { - return response.json(); + return response; } else { throw response; } @@ -3547,6 +3560,14 @@ export const AccountApiFactory = function (configuration?: Configuration, fetch? accountGetUserDataById(userId: string, options?: any) { return AccountApiFp(configuration).accountGetUserDataById(userId, options)(fetch, basePath); }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountGetUserSummary(options?: any) { + return AccountApiFp(configuration).accountGetUserSummary(options)(fetch, basePath); + }, /** * * @param {InviteLecturerViewModel} [body] @@ -3565,6 +3586,14 @@ export const AccountApiFactory = function (configuration?: Configuration, fetch? accountLogin(body?: LoginViewModel, options?: any) { return AccountApiFp(configuration).accountLogin(body, options)(fetch, basePath); }, + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + */ + accountLogout(options?: any) { + return AccountApiFp(configuration).accountLogout(options)(fetch, basePath); + }, /** * * @param {*} [options] Override http request option. @@ -3674,6 +3703,16 @@ export class AccountApi extends BaseAPI { return AccountApiFp(this.configuration).accountGetUserDataById(userId, options)(this.fetch, this.basePath); } + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AccountApi + */ + public accountGetUserSummary(options?: any) { + return AccountApiFp(this.configuration).accountGetUserSummary(options)(this.fetch, this.basePath); + } + /** * * @param {InviteLecturerViewModel} [body] @@ -3696,6 +3735,16 @@ export class AccountApi extends BaseAPI { return AccountApiFp(this.configuration).accountLogin(body, options)(this.fetch, this.basePath); } + /** + * + * @param {*} [options] Override http request option. + * @throws {RequiredError} + * @memberof AccountApi + */ + public accountLogout(options?: any) { + return AccountApiFp(this.configuration).accountLogout(options)(this.fetch, this.basePath); + } + /** * * @param {*} [options] Override http request option. @@ -3771,14 +3820,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (userId !== undefined) { localVarQueryParameter['userId'] = userId; } @@ -3812,14 +3853,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -3858,14 +3891,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -3894,14 +3919,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -3930,14 +3947,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -3966,14 +3975,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4002,14 +4003,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4045,14 +4038,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (userId !== undefined) { localVarQueryParameter['userId'] = userId; } @@ -4092,14 +4077,6 @@ export const CourseGroupsApiFetchParamCreator = function (configuration?: Config const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -4539,14 +4516,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4581,14 +4550,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4612,14 +4573,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -4652,14 +4605,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4695,14 +4640,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -4735,14 +4672,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4765,14 +4694,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4801,14 +4722,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4831,14 +4744,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4867,14 +4772,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4898,14 +4795,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (programName !== undefined) { localVarQueryParameter['programName'] = programName; } @@ -4938,14 +4827,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -4980,14 +4861,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -5010,14 +4883,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -5052,14 +4917,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -5088,14 +4945,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -5125,14 +4974,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -5172,14 +5013,6 @@ export const CoursesApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -5943,14 +5776,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -5973,14 +5798,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -6004,14 +5821,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (expertEmail !== undefined) { localVarQueryParameter['expertEmail'] = expertEmail; } @@ -6039,14 +5848,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -6074,14 +5875,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -6109,14 +5902,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -6143,14 +5928,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -6174,14 +5951,6 @@ export const ExpertsApiFetchParamCreator = function (configuration?: Configurati const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -6539,14 +6308,6 @@ export const FilesApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (fileId !== undefined) { localVarQueryParameter['fileId'] = fileId; } @@ -6579,14 +6340,6 @@ export const FilesApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -6610,14 +6363,6 @@ export const FilesApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -6650,14 +6395,6 @@ export const FilesApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -6686,14 +6423,6 @@ export const FilesApiFetchParamCreator = function (configuration?: Configuration const localVarQueryParameter = {} as any; const localVarFormParams = new URLSearchParams(); - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (filesScopeCourseId !== undefined) { localVarFormParams.set('FilesScope.CourseId', filesScopeCourseId as any); } @@ -6987,14 +6716,6 @@ export const HomeworksApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -7027,14 +6748,6 @@ export const HomeworksApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7063,14 +6776,6 @@ export const HomeworksApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7099,14 +6804,6 @@ export const HomeworksApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7136,14 +6833,6 @@ export const HomeworksApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -7402,14 +7091,6 @@ export const NotificationsApiFetchParamCreator = function (configuration?: Confi const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -7436,14 +7117,6 @@ export const NotificationsApiFetchParamCreator = function (configuration?: Confi const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7466,14 +7139,6 @@ export const NotificationsApiFetchParamCreator = function (configuration?: Confi const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7496,14 +7161,6 @@ export const NotificationsApiFetchParamCreator = function (configuration?: Confi const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7527,14 +7184,6 @@ export const NotificationsApiFetchParamCreator = function (configuration?: Confi const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -7783,14 +7432,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7815,14 +7456,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (taskId !== undefined) { localVarQueryParameter['taskId'] = taskId; } @@ -7859,14 +7492,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7895,14 +7520,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7937,14 +7554,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -7974,14 +7583,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (secondMentorId !== undefined) { localVarQueryParameter['secondMentorId'] = secondMentorId; } @@ -8009,14 +7610,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - if (taskId !== undefined) { localVarQueryParameter['taskId'] = taskId; } @@ -8049,14 +7642,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -8085,14 +7670,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -8163,14 +7740,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -8204,14 +7773,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -8245,14 +7806,6 @@ export const SolutionsApiFetchParamCreator = function (configuration?: Configura const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -8835,14 +8388,6 @@ export const StatisticsApiFetchParamCreator = function (configuration?: Configur const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -8871,14 +8416,6 @@ export const StatisticsApiFetchParamCreator = function (configuration?: Configur const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -8907,14 +8444,6 @@ export const StatisticsApiFetchParamCreator = function (configuration?: Configur const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9086,14 +8615,6 @@ export const SystemApiFetchParamCreator = function (configuration?: Configuratio const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9187,14 +8708,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -9222,14 +8735,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -9263,14 +8768,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); @@ -9303,14 +8800,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9339,14 +8828,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9369,14 +8850,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9405,14 +8878,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9441,14 +8906,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); // fix override query string Detail: https://stackoverflow.com/a/7517673/1077943 localVarUrlObj.search = null; @@ -9478,14 +8935,6 @@ export const TasksApiFetchParamCreator = function (configuration?: Configuration const localVarHeaderParameter = {} as any; const localVarQueryParameter = {} as any; - // authentication Bearer required - if (configuration && configuration.apiKey) { - const localVarApiKeyValue = typeof configuration.apiKey === 'function' - ? configuration.apiKey("Authorization") - : configuration.apiKey; - localVarHeaderParameter["Authorization"] = localVarApiKeyValue; - } - localVarHeaderParameter['Content-Type'] = 'application/json'; localVarUrlObj.query = Object.assign({}, localVarUrlObj.query, localVarQueryParameter, options.query); diff --git a/hwproj.front/src/components/Auth/Login.tsx b/hwproj.front/src/components/Auth/Login.tsx index 1f9e7a3ce..c1caa68f3 100644 --- a/hwproj.front/src/components/Auth/Login.tsx +++ b/hwproj.front/src/components/Auth/Login.tsx @@ -51,7 +51,7 @@ const Login: FC = (props) => { email: '', password: '', error: [], - isLogin: ApiSingleton.authService.isLoggedIn(), + isLogin: ApiSingleton.authService.loggedIn(), }) // Состояние для ошибки электронной почты diff --git a/hwproj.front/src/components/Courses/Course.tsx b/hwproj.front/src/components/Courses/Course.tsx index c2309e0fe..27fc036c9 100644 --- a/hwproj.front/src/components/Courses/Course.tsx +++ b/hwproj.front/src/components/Courses/Course.tsx @@ -267,8 +267,7 @@ const Course: React.FC = () => { course && course.mentors!.some(t => t.userId === userId) if (shouldRefreshToken) { - const newToken = await ApiSingleton.accountApi.accountRefreshToken() - newToken.value && ApiSingleton.authService.refreshToken(newToken.value.accessToken!) + await ApiSingleton.authService.refreshAccessToken(); return } diff --git a/hwproj.front/src/components/Courses/CoursesList.tsx b/hwproj.front/src/components/Courses/CoursesList.tsx index 4bf3917d5..c6ae7168d 100644 --- a/hwproj.front/src/components/Courses/CoursesList.tsx +++ b/hwproj.front/src/components/Courses/CoursesList.tsx @@ -37,7 +37,7 @@ export class CoursesList extends React.Component { > diff --git a/hwproj.front/src/components/Courses/Statistics/StudentStatsChart.tsx b/hwproj.front/src/components/Courses/Statistics/StudentStatsChart.tsx index 10b7720ea..7c80c56b9 100644 --- a/hwproj.front/src/components/Courses/Statistics/StudentStatsChart.tsx +++ b/hwproj.front/src/components/Courses/Statistics/StudentStatsChart.tsx @@ -30,7 +30,7 @@ interface IStudentStatsChartState { const StudentStatsChart: React.FC = () => { const {courseId} = useParams(); - const isLoggedIn = ApiSingleton.authService.isLoggedIn(); + const isLoggedIn = ApiSingleton.authService.loggedIn(); const [selectedStudents, setSelectedStudents] = useState([]); const [state, setState] = useState({ isFound: false, diff --git a/hwproj.front/src/components/Experts/AuthLayout.tsx b/hwproj.front/src/components/Experts/AuthLayout.tsx index ebfb92c9b..64476dde1 100644 --- a/hwproj.front/src/components/Experts/AuthLayout.tsx +++ b/hwproj.front/src/components/Experts/AuthLayout.tsx @@ -20,11 +20,17 @@ const ExpertAuthLayout: FC = (props: IExpertAuthLayoutPr useEffect(() => { const checkToken = async () => { + if (!token) { + setIsTokenValid(false); + setIsLoading(false); + return; + } + const isExpired = ApiSingleton.authService.isTokenExpired(token); if (!isExpired) { - const isExpertLoggedIn = await ApiSingleton.expertsApi.expertsLogin(credentials) - if (isExpertLoggedIn.succeeded) { - ApiSingleton.authService.setToken(token!); + try { + await ApiSingleton.expertsApi.expertsLogin(credentials); + await ApiSingleton.authService.getUser(); setIsTokenValid(true); props.onLogin(); @@ -32,13 +38,17 @@ const ExpertAuthLayout: FC = (props: IExpertAuthLayoutPr if (isEdited.succeeded && isEdited.value) { setIsProfileAlreadyEdited(true); } - + } + catch { + setIsTokenValid(false); + } + finally { setIsLoading(false); - return } + } else { + setIsTokenValid(false); + setIsLoading(false); } - setIsTokenValid(false); - setIsLoading(false); }; checkToken(); diff --git a/hwproj.front/src/services/AuthService.ts b/hwproj.front/src/services/AuthService.ts index be0770392..614f5ad6c 100644 --- a/hwproj.front/src/services/AuthService.ts +++ b/hwproj.front/src/services/AuthService.ts @@ -1,7 +1,14 @@ -import {LoginViewModel, AccountApi, RegisterViewModel} from '../api'; -import ApiSingleton from "../api/ApiSingleton"; +import {LoginViewModel, RegisterViewModel} from '../api'; +import ApiSingleton, {accountApiWithoutRedirect} from "../api/ApiSingleton"; import decode from "jwt-decode"; + +interface User { + id: string; + email: string; + role: string; +} + interface TokenPayload { _userName: string; _id: string; @@ -13,25 +20,50 @@ interface TokenPayload { } export default class AuthService { - client = new AccountApi(); + private _user: User | null = null; constructor() { this.login = this.login.bind(this); this.getProfile = this.getProfile.bind(this); } + public async getUser() { + try { + const accountData = await accountApiWithoutRedirect.accountGetUserSummary(); + if (accountData) { + this._user = { + id: accountData.userId!, + email: accountData.email!, + role: accountData.role!, + }; + } else { + this._user = null; + } + } + catch (e) { + this._user = null; + } + } + async login(user: LoginViewModel) { - const token = await ApiSingleton.accountApi.accountLogin(user) - if (token.errors) { + try { + await ApiSingleton.accountApi.accountLogin(user); + await this.getUser(); + return { - error: token.errors, - isLogin: false + error: null, + isLogin: true } } - this.setToken(token.value?.accessToken!) - return { - error: null, - isLogin: true + catch (e: any) { + this._user = null; + + const status = e?.status ?? e?.response?.status; + const message = status === 401 ? "Неверный логин или пароль" : "Ошибка авторизации"; + return { + error: [message], + isLogin: false + } } } @@ -43,95 +75,70 @@ export default class AuthService { } } - isLoggedIn() { - const token = this.getToken(); - return !!token && !this.isTokenExpired(token); - } + loggedIn = () => this._user !== null; - isTokenExpired(token: any) { + async refreshAccessToken(){ try { - let decoded = decode(token); - return decoded.exp < Date.now() / 1000; - } catch (err) { - return true; + await ApiSingleton.accountApi.accountRefreshToken(); + await this.getUser(); + window.location.reload(); + } + catch { + await this.logout(); } } - getTokenExpirationDate(token: any) { - const decoded = decode(token); - const expirationDate = new Date(decoded.exp * 1000); - - return expirationDate.toLocaleDateString('ru-RU', { - day: 'numeric', - month: 'long', - year: 'numeric', - }); - } - - setToken = (idToken: string) => localStorage.setItem("id_token", idToken); - - refreshToken = (idToken: string) => { - this.setToken(idToken) - window.location.reload() - } - - getToken = () => localStorage.getItem("id_token"); + public async getProfile() { + await this.getUser(); - logout = () => localStorage.clear(); - - getProfile = () => { - let result = decode(this.getToken() as string); - if (result.exp < 1761527002) { - this.logout() - alert("Мы обновили кое-что важное, и чтобы все правильно работало, просим вас заново войти в аккаунт! Приносим извинения за неудобства.") - window.location.reload() - } - return result + return this._user; }; - getUserId = () => this.getProfile()._id; + getUserId = () => this._user?.id ?? ""; isExpertProfileEdited = async () => await ApiSingleton.expertsApi.expertsGetIsProfileEdited(); setIsExpertProfileEdited = async () => await ApiSingleton.expertsApi.expertsSetProfileIsEdited(); - loggedIn = () => this.getToken() !== null + getUserEmail = () => this._user?.email ?? ""; - getUserEmail = () => { - if (this.getToken() === null) { - return "" - } - return this.getProfile()["http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"] + getRole = () => this._user?.role ?? ""; + + isMentor() { + const role = this._user?.role ?? ""; + return role === "Lecturer" || role === "Expert"; } - getRole = () => { - if (this.getToken() === null) { - return null - } + isLecturer = () => this._user?.role === "Lecturer"; - return this.getProfile()["http://schemas.microsoft.com/ws/2008/06/identity/claims/role"]; - } - - isMentor() { - if (this.getToken() === null) { - return false + isExpert = () => this._user?.role === "Expert"; + + async logout() { + try { + await ApiSingleton.accountApi.accountLogout(); } + catch {} - const role = this.getProfile()["http://schemas.microsoft.com/ws/2008/06/identity/claims/role"]; - return role === "Lecturer" || role === "Expert"; + this._user = null; } - isLecturer() { - if (this.getToken() === null) { - return false + isTokenExpired(token: any) { + try { + let decoded = decode(token); + return decoded.exp < Date.now() / 1000; + } catch (err) { + return true; } - return this.getProfile()["http://schemas.microsoft.com/ws/2008/06/identity/claims/role"] === "Lecturer" } - isExpert() { - if (this.getToken() === null) { - return false - } - return this.getProfile()["http://schemas.microsoft.com/ws/2008/06/identity/claims/role"] === "Expert" + getTokenExpirationDate(token: any) { + const decoded = decode(token); + const expirationDate = new Date(decoded.exp * 1000); + + return expirationDate.toLocaleDateString('ru-RU', { + day: 'numeric', + month: 'long', + year: 'numeric', + }); } } diff --git a/hwproj.front/vite.config.ts b/hwproj.front/vite.config.ts index a5740710f..61248f857 100644 --- a/hwproj.front/vite.config.ts +++ b/hwproj.front/vite.config.ts @@ -35,7 +35,7 @@ export default defineConfig({ hmr: { host: 'localhost', port: 3000, - protocol: 'wss' + protocol: 'ws' }, open: true },