public UserModule(IUsersStore userStore, IEventStore eventStore) : base("/users") { _userStore = userStore; Post("/", _ => { var newUser = this.Bind <LoyalProgramUser>(); AddRegisteredUser(newUser); eventStore.PutEvent("UserAdded", newUser); return(CreatedResponse(newUser)); }); Put("/{userId:int}", parameter => { int userId = parameter.userId; var updatedUser = this.Bind <LoyalProgramUser>(); _userStore.UpdateUser(userId, updatedUser); eventStore.PutEvent("UserUpdated", updatedUser); return(updatedUser); }); Get("/{userId:int}", parameter => { var userId = parameter.userId; var user = _userStore.GetUser(userId); return(user != null ? user : HttpStatusCode.NotFound); }); }
public async Task <TransactionsSummary> BuildAsync(string userIdentifier, DateTime from, DateTime to) { var accountTransactions = transactionStore.GetTransactions(usersStore.GetUser(userIdentifier), from, to); if (accountTransactions.Count == 0) { // TODO: Should this class do the import? Currently it does. await transactionsImporter.ImportTransactionsAsync(userIdentifier); accountTransactions = transactionStore.GetTransactions(usersStore.GetUser(userIdentifier), from, to); } // TODO: Need to improve it and make it more readable. var categories = accountTransactions.SelectMany(at => at.Value, (at, t) => new { AccountIdentifier = at.Key, Transaction = t }) .GroupBy(at => new { at.AccountIdentifier, at.Transaction.Category }) // Calcuate summary based on account and category .Select(g => new { g.Key.AccountIdentifier, g.Key.Category, Summary = BuildAccountSummary(g.Key.AccountIdentifier, g.Key.Category, g.Select(at => at.Transaction)) }) .GroupBy(accountSummary => accountSummary.Category) // Group again on category .Select(g => new CategorySummary(g.Key, g.Select(accountSummary => accountSummary.Summary).ToList())) .ToList(); return(new TransactionsSummary(from, to, categories)); }
public async Task <TransactionsImportResult> ImportTransactionsAsync(string userIdentifier) { var user = usersStore.GetUser(userIdentifier); TransactionsImportResult result = new TransactionsImportResult(); var accounts = await bankDataProvider.GetUserAccountsAsync(user); foreach (var account in accounts) { transactionsStore.AddAccount(user, account); result.AccountsImported.Add(await ImportAcountTransactions(user, account)); } return(result); }