This commit is contained in:
skidoodle 2024-03-13 00:33:46 +01:00
commit e124a47765
19374 changed files with 9806149 additions and 0 deletions

View file

@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http.Headers;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;
using Kreta.BusinessLogic.Classes.MobileApi.Common.Co;
using Kreta.BusinessLogic.Classes.MobileApi.Common.Enum;
using Kreta.Web.Configuration;
namespace Kreta.Web.Areas.MobileApi.Attributes
{
// <summary>
/// Authorization filter attribute
/// </summary>
/// <seealso cref="System.Web.Http.Filters.AuthorizationFilterAttribute" />
class MobileApiAuthorizationAttribute : AuthorizationFilterAttribute, IOverrideFilter
{
/// <summary>
/// Institute code
/// </summary>
const string InstituteCode = nameof(InstituteCode);
/// <summary>
/// Gets the API key.
/// </summary>
const string ApiKey = nameof(ApiKey);
/// <summary>
/// User Id
/// </summary>
const string UserId = nameof(UserId);
/// <summary>
/// Tutelary Id
/// </summary>
const string TutelaryId = nameof(TutelaryId);
/// <summary>
/// User roles
/// </summary>
const string UserRoles = nameof(UserRoles);
const string SchoolYearId = nameof(SchoolYearId);
/// <summary>
/// Gets the filters to override.
/// </summary>
public Type FiltersToOverride
{
get
{
return typeof(IAuthorizationFilter);
}
}
/// <summary>
/// Validating api key
/// </summary>
/// <param name="apiKeyHeader">Header item, contains api key</param>
/// <returns>true, if api key is valid (access granted)</returns>
private bool AccessGratnedByApiKey(KeyValuePair<string, IEnumerable<string>> apiKeyHeader)
{
if (apiKeyHeader.Value != null)
{
string targetApiKey = apiKeyHeader.Value.SingleOrDefault();
if (!string.IsNullOrWhiteSpace(targetApiKey) && targetApiKey == MobileApiConfigurationSection.Instance.ApiKey)
{
return true;
}
}
return false;
}
/// <summary>
/// Get mobile user
/// </summary>
/// <param name="headers">Http headers</param>
/// <returns>Mobile user</returns>
private MobileUser GetMobileUser(HttpRequestHeaders headers)
{
var instituteCodeHeaderValue = headers.SingleOrDefault(x => x.Key.Equals(InstituteCode, StringComparison.InvariantCultureIgnoreCase)).Value?.SingleOrDefault();
var schoolYearIdHeaderValue = headers.SingleOrDefault(x => x.Key.Equals(SchoolYearId, StringComparison.InvariantCultureIgnoreCase)).Value?.SingleOrDefault();
int schoolYearId;
int userId;
var userIdHeaderValue = headers.SingleOrDefault(x => x.Key.Equals(UserId, StringComparison.InvariantCultureIgnoreCase)).Value?.SingleOrDefault();
if (userIdHeaderValue == null)
{
throw new InvalidOperationException($"\"{UserId}\" header value was not found");
}
if (!int.TryParse(userIdHeaderValue, out userId))
{
throw new InvalidOperationException($"Cannot parse \"{UserId}\" header value: \"{userIdHeaderValue}\"");
}
if (schoolYearIdHeaderValue == null)
{
throw new InvalidOperationException($"\"{SchoolYearId}\" header value was not found");
}
if (!int.TryParse(schoolYearIdHeaderValue, out schoolYearId))
{
throw new InvalidOperationException($"Cannot parse \"{SchoolYearId}\" header value: \"{schoolYearIdHeaderValue}\"");
}
int? tutelaryId = null;
var tutelaryIdHeaderValue = headers.SingleOrDefault(x => x.Key.Equals(TutelaryId, StringComparison.InvariantCultureIgnoreCase)).Value?.SingleOrDefault() ?? string.Empty;
if (tutelaryIdHeaderValue == null)
{
throw new InvalidOperationException($"\"{TutelaryId}\" header value was not found");
}
if (!string.IsNullOrWhiteSpace(tutelaryIdHeaderValue.Trim()))
{
int tutelaryId1;
if (!int.TryParse(tutelaryIdHeaderValue, out tutelaryId1))
{
throw new InvalidOperationException($"Cannot parse \"{TutelaryId}\" header value: \"{tutelaryIdHeaderValue}\"");
}
tutelaryId = tutelaryId1;
}
var userRolesHeaderValue = headers.SingleOrDefault(x => x.Key.Equals(UserRoles, StringComparison.InvariantCultureIgnoreCase)).Value?.SingleOrDefault();
if (userRolesHeaderValue == null)
{
throw new InvalidOperationException($"\"{UserRoles}\" header value was not found");
}
List<MobileUserRole> userRoles = new List<MobileUserRole>();
foreach (string userRoleHeaderValue in userRolesHeaderValue.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
{
MobileUserRole userRole;
if (!Enum.TryParse(userRoleHeaderValue, out userRole))
{
throw new InvalidOperationException($"\"{userRoleHeaderValue}\" is not a valid user role");
}
userRoles.Add(userRole);
}
return new MobileUser(instituteCodeHeaderValue, userId, tutelaryId, userRoles, schoolYearId);
}
/// <summary>
/// Authorization event
/// </summary>
/// <param name="actionContext">Context of the current action</param>
/// <param name="cancellationToken">Cancellation token</param>
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
var headers = actionContext.Request.Headers;
var apiKeyHeader = headers.SingleOrDefault(x => x.Key.Equals(ApiKey, StringComparison.InvariantCultureIgnoreCase));
if (!AccessGratnedByApiKey(apiKeyHeader))
{
actionContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
}
HttpContext.Current?.Items?.Add(nameof(MobileUser), GetMobileUser(headers));
return Task.FromResult(0);
}
}
}

View file

@ -0,0 +1,37 @@
using System;
using System.Web;
using Kreta.BusinessLogic.Classes.MobileApi.Common.Co;
namespace Kreta.Web.Areas.MobileApi.ModelConverter
{
public static class MobileUserModelConverter
{
/// <summary>
/// Try get mobile user from http context
/// </summary>
/// <param name="mobileUser">Mobile user</param>
/// <returns>True if mobile user exists</returns>
public static bool TryLoadFromHttpContext(out MobileUser mobileUser)
{
mobileUser = (MobileUser)HttpContext.Current?.Items?[nameof(MobileUser)];
return mobileUser != null;
}
/// <summary>
/// Try get mobile user from http context
/// </summary>
/// <param name="mobileUser">Mobile user</param>
/// <returns>True if mobile user exists</returns>
public static MobileUser GetFromHttpContext()
{
MobileUser user;
if (!TryLoadFromHttpContext(out user))
{
throw new InvalidOperationException($"There is no existing mobile user in http context {nameof(MobileUser)}");
}
return user;
}
}
}

View file

@ -0,0 +1,113 @@
namespace Kreta.Web.Areas.MobileApi.Naplo
{
using System;
using System.Collections.Generic;
using System.Web.Http;
using Kreta.BusinessLogic.Classes.MobileApi.Common.Co;
using Kreta.BusinessLogic.Classes.MobileApi.Naplo;
using Kreta.BusinessLogic.Interfaces;
using Kreta.Client.CoreApi;
using Kreta.Naplo.Domain.V2.Model;
using Kreta.Naplo.Domain.V2.Model.CustomEnum;
using Kreta.Naplo.Domain.V2.Model.Get.Enum;
using Kreta.Naplo.Domain.V2.Model.Get.OpenBoard;
using Kreta.Naplo.Domain.V2.Model.Get.Ora.JavasoltJelenletTemplate;
using Kreta.Naplo.Domain.V2.Model.Get.Orarend;
using Kreta.Naplo.Domain.V2.Model.Get.Tanar;
using Kreta.Naplo.Domain.V2.Model.Get.Tanmenet;
using Kreta.Naplo.Domain.V2.Model.Get.Tanulo;
using Kreta.Naplo.Domain.V2.Model.Post.Ertekeles;
using Kreta.Naplo.Domain.V2.Model.Post.Naplozas;
using Kreta.Naplo.Domain.V2.Model.Post.OpenBoard;
using Kreta.Web.Areas.MobileApi.Attributes;
using Kreta.Web.Security;
using static Kreta.Naplo.Domain.V2.Model.Converter.GetModelConverter;
using static Kreta.Naplo.Domain.V2.Model.Converter.PostModelConverter;
using OrarendiOra = Kreta.Naplo.Domain.V2.Model.Get.Ora.OrarendiOra.JavasoltJelenlet;
using TanitasiOra = Kreta.Naplo.Domain.V2.Model.Get.Ora.TanitasiOra.JavasoltJelenlet;
[MobileApiAuthorization, LocalRequestOnly, RoutePrefix("api/Mobile/Naplo/V2")]
public class NaploV2Controller : ApiController
{
private readonly IFileServiceHelper fileServiceHelper;
private readonly ICoreApiClient coreApiClient;
public NaploV2Controller(IFileServiceHelper fileServiceHelper, ICoreApiClient coreApiClient)
{
this.fileServiceHelper = fileServiceHelper ?? throw new ArgumentNullException(nameof(fileServiceHelper));
this.coreApiClient = coreApiClient ?? throw new ArgumentNullException(nameof(coreApiClient));
}
[HttpGet, Route("Tanmenet")]
public List<TanmenetGetResponse> ListTanmenet([FromUri] TanmenetGetRequest request)
=> CoToModel(this.Facade().ListTanmenet(request));
[HttpGet, Route("Ora/OrarendiOra/JavasoltJelenlet")]
public List<OrarendiOra.JavasoltJelenletGetResponse> ListJavasoltJelenlet([FromUri] OrarendiOra.JavasoltJelenletGetRequest request)
=> CoToModel(this.Facade().ListJavasoltJelenlet(request));
[HttpGet, Route("Ora/TanitasiOra/JavasoltJelenlet")]
public List<TanitasiOra.JavasoltJelenletGetResponse> ListJavasoltJelenletTanitasiOra([FromUri] TanitasiOra.JavasoltJelenletGetRequest request)
=> CoToModel(this.Facade().ListJavasoltJelenlet(request));
[HttpGet, Route("Ora/Feljegyzes")]
public ResponseWrapper<List<FeljegyzesResponse>> GetFeljegyzesLista([FromUri] FeljegyzesRequest request)
=> ResponseWrapper<List<FeljegyzesResponse>>.Create(this.Facade().FeljegyzesLista(request), CoToModel);
[HttpGet, Route("Ora/Mulasztas")]
public ResponseWrapper<List<MulasztasResponse>> GetMulasztasLista([FromUri] MulasztasRequest request)
=> ResponseWrapper<List<MulasztasResponse>>.Create(this.Facade().MulasztasLista(request), CoToModel);
[HttpGet, Route("Ora/JavasoltJelenletTemplate")]
public ResponseWrapper<List<JavasoltJelenletTemplateGetResponse>> ListJavasoltJelenletTemplate([FromUri] JavasoltJelenletTemplateGetRequest request)
=> ResponseWrapper<List<JavasoltJelenletTemplateGetResponse>>.Create(this.Facade().ListJavasoltJelenletTemplate(request), CoToModel);
[HttpGet, Route("Enum/NaploEnum")]
public ResponseWrapper<List<NaploEnumListItem>> GetNaploEnum([FromUri] EnumRequest request)
=> ResponseWrapper<List<NaploEnumListItem>>.Create(this.Facade().GetNaploEnum(request), CoToModel);
[HttpGet, Route("Orarend/OraLista")]
public ResponseWrapper<List<OraGetResponse>> GetOraLista([FromUri] OraGetRequest request)
=> ResponseWrapper<List<OraGetResponse>>.Create(this.Facade().OraLista(request), CoToModel);
[HttpGet, Route("Ora/OsztalyTanuloi")]
public ResponseWrapper<OsztalyTanuloiResponse> GetOsztalyTanuloi([FromUri] OsztalyTanuloiRequest request)
=> ResponseWrapper<OsztalyTanuloiResponse>.Create(this.Facade().GetOsztalyTanuloi(request), CoToModel);
[HttpGet, Route("Tanar/Profil")]
public ResponseWrapper<ProfilResponse> GetProfil([FromUri] ProfilRequest request)
=> ResponseWrapper<ProfilResponse>.Create(this.Facade().Profil(request), CoToModel);
[HttpGet, Route("Iskolaor")]
public ResponseWrapper<List<IskolaorResponse>> GetIskolaor([FromUri] IskolaorRequest request)
=> ResponseWrapper<List<IskolaorResponse>>.Create(this.Facade().Iskolaor(request), CoToModel);
[HttpPost, Route("Orarend/OraNaplozas")]
public List<OraNaplozasResponse> CreateOraNaplozas(List<OraNaplozasRequest> request)
=> CoToModel(this.Facade().CreateOraNaplozas(ModelToCo(request)));
[HttpPost, Route("Ertekeles/OsztalyCsoportErtekeles")]
public List<ErtekelesResponse> CreateOsztalyCsoportErtekeles(List<OsztalyCsoportErtekelesRequest> request)
=> CoToModel(this.Facade().CreateOsztalyCsoportErtekeles(ModelToCo(request)));
[HttpPost, Route("OpenBoard/FajlFeltoltes")]
public FeltoltottFajlResponse CreateFajlFeltoltes(FeltoltottFajlRequest request)
=> CoToModel(this.Facade().CreateFajlFeltoltes(ModelToCo(request)));
[HttpGet, Route("OpenBoard/FeltolthetoFajlokSzama")]
public FeltolthetoFajlokSzamaResponse GetFeltolthetoFajlokSzama([FromUri] FeltolthetoFajlokSzamaRequest request)
{
return CoToModel(this.Facade().GetFeltolthetoFajlokSzama(ModelToCo(request)));
}
[HttpGet, Route("Tanulo/Ertekeles")]
public List<ErtekelesGetResponse> GetTanuloErtekelesei([FromUri] ErtekelesGetRequest request)
{
return CoToModel(this.Facade().GetTanuloErtekelesei(ModelToCo(request)));
}
private NaploFacadeV2 Facade() => new NaploFacadeV2(this.MobileUser(), fileServiceHelper, coreApiClient);
private MobileUser MobileUser() => ModelConverter.MobileUserModelConverter.GetFromHttpContext();
}
}