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; } }
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); } }