init
This commit is contained in:
commit
e124a47765
19374 changed files with 9806149 additions and 0 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
113
KretaWeb/Areas/MobileApi/Naplo/NaploV2Controller.cs
Normal file
113
KretaWeb/Areas/MobileApi/Naplo/NaploV2Controller.cs
Normal 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();
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue