Untitled

 avatar
unknown
plain_text
2 years ago
4.6 kB
6
Indexable
using Inaspect.Data.Model.MockInspectionV2.Logs;
using Inaspect.Data.Repository.Repositories.MockInspectionV2;
using Inaspect.Data.Service.Helpers.Miv2Logs;
using MethodDecorator.Fody.Interfaces;
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Web.Http;
using static Inaspect.Data.Service.Common.Enumerators;

[module: LogInterceptor]

namespace Inaspect.Data.Service.Helpers.Miv2Logs
{
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Constructor 
        | AttributeTargets.Assembly | AttributeTargets.Module)]
    public class LogInterceptor : Attribute, IMethodDecorator
    {
        public Miv2Area Area { get; set; }
        public Miv2Operation Operation { get; set; }
        public QualityStatementLogModel OldQualityStatement { get; set; }
        public PreliminaryQuestionLogModel OldPreliminaryQuestionObject { get; set; }
        public int UserId { get; set; }
        public int Miv2InstanceId { get; set; }

        private object[] objectArgs;
        readonly IMiv2LogRepository miv2LogRepository = GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(IMiv2LogRepository)) as IMiv2LogRepository;

        public void Init(object instance, MethodBase method, object[] args)
        {
            objectArgs = args;
        }

        public void OnEntry()
        {
            int areaId = GetAreaId();
            switch (Area)
            {
                case Miv2Area.QualityStatement:
                    if(areaId != 0)
                    {
                        var qualityStatementModel = miv2LogRepository.GetQualityStatementLogModel(areaId);
                        OldQualityStatement = qualityStatementModel;
                    }
                    break;
                //case Miv2Area.PreliminaryQuestions:
                //    object preliminaryQuestions = objectArgs[0].GetType().GetProperty("PreliminaryQuestions").GetValue(objectArgs[0], null); 
                //    object preliminaryQuestionsIds = preliminaryQuestions.GetType().GetProperty("Id").GetValue(preliminaryQuestions, null);
                //    UserId = (int)objectArgs[0].GetType().GetProperty("UserId").GetValue(objectArgs[0], null);
                //    Miv2InstanceId = (int)objectArgs[0].GetType().GetProperty("Miv2InstanceId").GetValue(objectArgs[0], null);
                //    var preliminaryQuestionModel = miv2LogRepository.GetQualityStatementLogModel((int)preliminaryQuestionsIds);
                //    break;
                default:
                    break;
            }
        }

        public void OnException(Exception exception)
        {
        }

        public void OnExit()
        {
            int areaId = GetAreaId();
            switch (Area)
            {
                case Miv2Area.QualityStatement:
                    if(areaId != 0)
                    {
                        var newQualityStatement = miv2LogRepository.GetQualityStatementLogModel(areaId); 
                        miv2LogRepository.InsertLog(GetLogMessages(OldQualityStatement, newQualityStatement, Operation, UserId, Miv2InstanceId));
                    }
                    break;
                default:
                    break;
            }
        }
        private int GetAreaId()
        {
            int id = 0;
            if (objectArgs[0] != null)
            {
                id = int.TryParse(objectArgs[0].GetType().GetProperty(Area.GetDescription()).GetValue(objectArgs[0], null).ToString(), out id) ? id : 0;
                SetUserId();
                SetMiv2InstanceId();
            }
            return id;
        }

        private void SetMiv2InstanceId()
        {
            int miv2InstanceId = int.TryParse(objectArgs[0].GetType().GetProperty("Miv2InstanceId").GetValue(objectArgs[0], null).ToString(), out miv2InstanceId) ? miv2InstanceId : 0;
            Miv2InstanceId = miv2InstanceId;
        }

        private void SetUserId()
        {
            int userId = int.TryParse(objectArgs[0].GetType().GetProperty("UserId").GetValue(objectArgs[0], null).ToString(), out userId) ? userId : 0;
            UserId = userId;
        }

        private List<LogMessage> GetLogMessages<T>(T oldObject, T newObject, Miv2Operation operation, int userId, int miv2InstanceId)
        {
            List<LogMessage> logMessages = oldObject.DetailedCompare(newObject, operation, userId, miv2InstanceId);
            return logMessages;
        }
    }
}
Editor is loading...