Beispiel #1
0
        /// <summary>
        /// 启动服务
        /// </summary>
        /// <param name="ApiRequestLoggerConnectionString">Api请求日志记录器数据库配置字符串</param>
        public static void Start(String ApiRequestLoggerConnectionString = "")
        {
            if (_isStart)
            {
                return;
            }

            if (!_isInitLog4Net ||
                (!String.IsNullOrWhiteSpace(ApiRequestLoggerConnectionString) && !_requestLoggerIsEnable) ||
                !_applicationLoggerIsEnable)
            {
                lock (lock_obj)
                {
                    if (!_isInitLog4Net)
                    {
                        InitLog4Net();
                        _isInitLog4Net = true;
                    }

                    if (!String.IsNullOrWhiteSpace(ApiRequestLoggerConnectionString) && !_requestLoggerIsEnable)
                    {
                        _apiRequestLogger      = new ApiRequestLogger(ApiRequestLoggerConnectionString);
                        _requestLoggerIsEnable = true;
                    }

                    if (!_applicationLoggerIsEnable)
                    {
                        _applicationLogger         = new Log4NetLogger();
                        _applicationLoggerIsEnable = true;
                    }

                    _isStart = true;
                }
            }
        }
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="quoteRepository">Repo for quote information.</param>
 /// <param name="videoRepository">Repo for video information.</param>
 /// <param name="newsRepository">Repo for news information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public PublicContentController(IQuoteRepository quoteRepository, IVideoRepository videoRepository, INewsRepository newsRepository, IApiRequestLogger requestLogger)
 {
     RequestLogger = requestLogger;
     QuoteRepo     = quoteRepository;
     NewsRepo      = newsRepository;
     VideoRepo     = videoRepository;
 }
Beispiel #3
0
        public async Task Invoke(HttpContext context, IApiRequestLogger logger)
        {
            await logger.PushRequestAsync(context);

            var originalBodyStream = context.Response.Body;

            try
            {
                using (var tempResponseBody = new MemoryStream())
                {
                    context.Response.Body = tempResponseBody;

                    await _next(context);

                    await logger.PushResponseAsync(context, tempResponseBody);

                    await tempResponseBody.CopyToAsync(originalBodyStream);
                }
            }
            finally
            {
                context.Response.Body = originalBodyStream;
                logger.LogCompletedRequest();
            }
        }
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="accountRepository">Repo to use for account information.</param>
 /// <param name="userRepository">Repo to user for user information.</param>
 /// <param name="accountService">Service for account balance information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public AccountController(IAccountRepository accountRepository, IUserRepository userRepository, IAccountService accountService, IApiRequestLogger requestLogger)
 {
     RequestLogger  = requestLogger;
     UserRepo       = userRepository;
     AccountRepo    = accountRepository;
     AccountService = accountService;
 }
Beispiel #5
0
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="accountRepository">Repo to use for account information.</param>
 /// <param name="budgetRepository">Repo to use for budget information.</param>
 /// <param name="userRepository">Repo to user for user information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public UserController(IAccountRepository accountRepository, IBudgetRepository budgetRepository, IUserRepository userRepository, IApiRequestLogger requestLogger)
 {
     RequestLogger = requestLogger;
     UserRepo      = userRepository;
     AccountRepo   = accountRepository;
     BudgetRepo    = budgetRepository;
 }
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="accountRepository">Repo to use for account information.</param>
 /// <param name="accountBalanceRepository">Repo for account balance information.</param>
 /// <param name="accountTemplateRepository">Repo fro account template information.</param>
 /// <param name="accountTypeRepository">Repo for account type information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public AccountService(IAccountRepository accountRepository, IAccountBalanceRepository accountBalanceRepository, IAccountTemplateRepository accountTemplateRepository, IAccountTypeRepository accountTypeRepository, IApiRequestLogger requestLogger)
 {
     RequestLogger         = requestLogger;
     AccountRepo           = accountRepository;
     AccountBalanceRepo    = accountBalanceRepository;
     AccountTemplateRepo   = accountTemplateRepository;
     AccountTypeRepository = accountTypeRepository;
 }
Beispiel #7
0
        public async Task InvokeAsync(HttpContext httpContext, IApiRequestLogger logger)
        {
            try
            {
                await _next(httpContext);
            }
            catch (WebRequestException wre)
            {
                logger.PushCaughtException(wre);

                await HandleExceptionAsync(httpContext, wre.ResponseStatusCode, wre.Message);
            }
            catch (Exception ex)
            {
                logger.PushCaughtException(ex);
                await HandleExceptionAsync(httpContext, (int)HttpStatusCode.InternalServerError, "Internal Server Error");
            }
        }
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="budgetCategoryTemplateRepository">Repo to use for budget category template information.</param>
 /// <param name="userRepository">Repo to user for user information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public BudgetTemplatesController(IBudgetCategoryTemplateRepository budgetCategoryTemplateRepository, IUserRepository userRepository, IApiRequestLogger requestLogger)
 {
     RequestLogger = requestLogger;
     UserRepo      = userRepository;
     BudgetCategoryTemplateRepo = budgetCategoryTemplateRepository;
 }
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="accountTemplateRepository"></param>
 /// <param name="userRepository">Repo to user for user information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 public AccountTemplatesController(IAccountTemplateRepository accountTemplateRepository, IUserRepository userRepository, IApiRequestLogger requestLogger)
 {
     RequestLogger       = requestLogger;
     UserRepo            = userRepository;
     AccountTemplateRepo = accountTemplateRepository;
 }
        public static User GetUserFromClaims(ClaimsPrincipal userPrincipal, IUserRepository userRepository, IApiRequestLogger requestLogger)
        {
            string externalId;
            string emailAddress;
            bool   emailVerified;

            try
            {
                externalId    = userPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;
                emailAddress  = userPrincipal.FindFirst(TivClaimTypes.EmailIdentifier).Value;
                emailVerified = userPrincipal.FindFirst(TivClaimTypes.EmailVerifiedIdentifier).Value.IsTrue();
            }
            catch
            {
                throw new WebRequestException(401, GENERAL_AUTH_ERROR);
            }

            if (externalId.IsNullOrEmpty() || emailAddress.IsNullOrEmpty())
            {
                throw new WebRequestException(401, GENERAL_AUTH_ERROR);
            }

            if (!emailVerified)
            {
                throw new WebRequestException(401, "User has not verified their primary email address.");
            }

            User user = null;

            // If we can't ensure the maximum user name from the external source as our search and as our key then we can only rely on email address. This is unllikely but possible.
            if (externalId.Length > 50)
            {
                requestLogger.LogWarn($"External User Name '{externalId}' will be truncated because of length, cannot use for ID based search and must rely on Email '{emailAddress}'.");
                externalId = externalId.VerifySize(50);
            }
            else
            {
                user = userRepository.FindByUserName(externalId);
            }

            if (user == null)
            {
                requestLogger.LogInfo($"User not found by User Name '{externalId}' searching by Email '{emailAddress}'.");
                user = userRepository.FindByEmail(emailAddress);
            }

            if (user == null)
            {
                user = NewUserFromExternalClaims(externalId, emailAddress);
                userRepository.Insert(user, externalId);
                requestLogger.LogInfo($"User not found by eternal information User Name '{externalId}' and Email '{emailAddress}', created a new user with ID '{user.Id}'.");
            }
            else if (!user.UserName.CompareNoCase(externalId) || !user.Email.CompareNoCase(emailAddress))
            {
                var changeNote =
                    $"Changing User Name and/or Email to to new value(s) given by external authority. '{user.UserName}' => '{externalId}', '{user.Email}' => '{emailAddress}'";
                requestLogger.LogWarn(changeNote);
                changeNote = $"{changeNote} on {DateTime.Now}";
                if (!user.Notes.IsNullOrEmpty())
                {
                    user.Notes += Environment.NewLine + changeNote;
                }
                else
                {
                    user.Notes = changeNote;
                }
                user.UserName = externalId;
                user.Email    = emailAddress;
                if (user.UserAccomplishments.Count == 0)
                {
                    requestLogger.LogInfo($"Adding default accomplishments to User Name '{externalId}' and Email '{emailAddress}'");
                    AddUserCreatedAccomplishment(user);
                }
                userRepository.Update(user, externalId);
            }
            else if (user.UserAccomplishments.Count == 0)
            {
                requestLogger.LogInfo($"Adding default accomplishments to User Name '{user.UserName}' and Email '{user.Email}'");
                AddUserCreatedAccomplishment(user);
                userRepository.Update(user, user.UserName);
            }

            return(user);
        }
Beispiel #11
0
 /// <summary>
 /// Standard constructor.
 /// </summary>
 /// <param name="reportRepository">Repo for report information.</param>
 /// <param name="requestLogger">Logger used to log information about request.</param>
 /// <param name="userRepository">The user repository.</param>
 public ReportController(IReportRepository reportRepository, IApiRequestLogger requestLogger, IUserRepository userRepository)
 {
     RequestLogger = requestLogger;
     ReportRepo    = reportRepository;
     UserRepo      = userRepository;
 }