Пример #1
0
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (!(context.ActionArguments.Values.FirstOrDefault(x => x is Update) is Update update))
            {
                context.Result = new StatusCodeResult(401);
                return;
            }

            var extendedUpdate = userContextProvider.Set(update);
            var id             = extendedUpdate.Type == UpdateType.CallbackQuery
                ? extendedUpdate.CallbackQuery.From.Id
                : extendedUpdate.RealMessage.From.Id;

            telegramUserIdProvider.Set(id);
            var dbUser = await loaderProvider
                         .Get <int, TelegramUser>()
                         .GetOrLoadAsync(id);

            userContextProvider.SetDatabaseUser(dbUser);
            var result = await next();

            if (result.Exception != null)
            {
                await telegramUsersNotifier
                .SendAsync((client, user) => client
                           .SendTextMessageAsync(user.Id, result.Exception.ToString()),
                           TelegramUserStates.Dev);

                result.ExceptionHandled = true;
                result.HttpContext.Response.StatusCode = 200;
            }
        }
Пример #2
0
        private async Task OnPreSavingAsync(ITelegramUserIdProvider telegramUserIdProvider,
                                            ILoaderProvider loaderProvider)
        {
            var entries = ChangeTracker.Entries()
                          .ToArray();

            var user = await loaderProvider
                       .Get <int, TelegramUser>()
                       .GetOrLoadAsync(telegramUserIdProvider.ProvidedValue, true);

            var now = DateTime.Now;

            entries
            .ForEach(x =>
            {
                if (!(x.Entity is Entity entity))
                {
                    return;
                }

                switch (x.State)
                {
                case EntityState.Added:
                    entity.CreatedAt = now;
                    entity.CreatedBy = user;
                    break;

                case EntityState.Modified:
                    entity.UpdatedAt = now;
                    entity.UpdatedBy = user;
                    break;

                case EntityState.Deleted:
                    if (entity is ISoftDeletable softDeletable)
                    {
                        x.State = EntityState.Modified;
                        softDeletable.DeletedAt = now;
                        softDeletable.DeletedBy = user;
                        softDeletable.IsDeleted = true;
                    }

                    break;
                }
            });
            // todo optimize
            user.LastUpdatedAt = now;
            if (entries
                .Select(x => x.Entity)
                .OfType <TelegramUser>()
                .All(x => x.Id != user.Id))
            {
                Update(user);
            }
        }