public void SaveExpense(Expense expense) { var context = new ExpenseDataContext(this.account); ExpenseEntity expenseRow = expense.ToTableEntity(); foreach (var expenseItem in expense.Details) { var expenseItemRow = expenseItem.ToTableEntity(expenseRow.PartitionKey, expense.Id); context.AddObject(AzureStorageNames.ExpenseTable, expenseItemRow); } context.AddObject(AzureStorageNames.ExpenseTable, expenseRow); context.SaveChanges(SaveChangesOptions.Batch); foreach (var expenseItem in expense.Details) { // save receipt image if any if (expenseItem.Receipt != null && expenseItem.Receipt.Length > 0) { this.receiptStorage.AddReceipt(expenseItem.Id, expenseItem.Receipt, string.Empty); var queue = new AzureQueue <NewReceiptMessage>(this.account, AzureStorageNames.NewReceiptMessage); queue.AddMessage(new NewReceiptMessage { ExpenseItemId = expenseItem.Id, ExpenseId = expense.Id, Username = expense.UserName }); } } }
public void Save(ExpenseExport expenseExport) { var context = new ExpenseDataContext(this.account); ExpenseExportEntity entity = expenseExport.ToTableEntity(); context.AddObject(AzureStorageNames.ExpenseExportTable, entity); context.SaveChanges(); }
private static IExpenseEntity GetExpenseRowById(ExpenseDataContext context, string username, string expenseRowKey) { var query = (from expense in context.ExpenseExpenseItem where expense.PartitionKey == username.EncodePartitionAndRowKey() && expense.RowKey == KeyGenerator.ExpenseEntityRowKey(expenseRowKey) select expense).AsTableServiceQuery(); return(query.Execute().SingleOrDefault().ToKind <IExpenseEntity>()); }
public IEnumerable<ExpenseExport> Retreive(DateTime jobDate) { var context = new ExpenseDataContext(this.account); string compareDate = jobDate.ToExpenseExportKey(); var query = (from export in context.ExpenseExport where export.PartitionKey.CompareTo(compareDate) <= 0 select export).AsTableServiceQuery(); var val = query.Execute(); return val.Select(e => e.ToModel()).ToList(); }
public IEnumerable <ExpenseExport> Retreive(DateTime jobDate) { var context = new ExpenseDataContext(this.account); string compareDate = jobDate.ToExpenseExportKey(); var query = (from export in context.ExpenseExport where export.PartitionKey.CompareTo(compareDate) <= 0 select export).AsTableServiceQuery(); var val = query.Execute(); return(val.Select(e => e.ToModel()).ToList()); }
public void Delete(ExpenseExport expenseExport) { var context = new ExpenseDataContext(this.account); var query = (from export in context.ExpenseExport where export.PartitionKey.CompareTo(expenseExport.ApproveDate.ToExpenseExportKey()) == 0 && export.RowKey.CompareTo(expenseExport.Id) == 0 select export).AsTableServiceQuery(); ExpenseExportEntity entity = query.Execute().SingleOrDefault(); if (entity == null) { return; } context.DeleteObject(entity); context.SaveChanges(); }
public void UpdateApproved(Expense expense) { var context = new ExpenseDataContext(this.account); IExpenseEntity expenseRow = GetExpenseRowById(context, expense.UserName, expense.Id); expenseRow.Approved = expense.Approved; var queue = new AzureQueue <ApprovedExpenseMessage>(this.account, AzureStorageNames.ApprovedExpenseMessage); queue.AddMessage(new ApprovedExpenseMessage { ExpenseId = expense.Id, ApproveDate = DateTime.UtcNow, Username = expense.UserName }); context.UpdateObject(expenseRow); context.SaveChanges(); }
public void UpdateExpenseItemImages(string username, string expenseId, string expenseItemId, string imageUri, string thumbnailUri) { var context = new ExpenseDataContext(this.account); // this query would work faster if we specify PartitionKey and RowKey // For simplicity we'll just do a table scan by expense item id var query = (from expenseItemRow in context.ExpenseExpenseItem where expenseItemRow.PartitionKey == username.EncodePartitionAndRowKey() && expenseItemRow.RowKey == KeyGenerator.ExpenseItemEntityRowKey(expenseId, expenseItemId) select expenseItemRow).AsTableServiceQuery(); var item = query.Execute().SingleOrDefault(); item.ReceiptUrl = imageUri; item.ReceiptThumbnailUrl = thumbnailUri; context.UpdateObject(item); context.SaveChanges(); }
public IEnumerable <Expense> GetExpensesByUser(string username) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; char charAfterSeparator = Convert.ToChar((Convert.ToInt32('_') + 1)); var nextId = ExpenseEntity.RowKeyPrefix + charAfterSeparator; // The Take(10) is not intended as a paging mechanism. // It was added to improve the performance of the application. // Using the partition key in the query will improve the performance // because the partition key is indexed. var query = (from expense in context.ExpenseExpenseItem where expense.PartitionKey.CompareTo(username.EncodePartitionAndRowKey()) == 0 && expense.RowKey.CompareTo(ExpenseEntity.RowKeyPrefix) >= 0 && expense.RowKey.CompareTo(nextId) < 0 select expense).Take(10).AsTableServiceQuery(); try { var expenses = new List <Expense>(); foreach (var entity in query.Execute()) { switch (entity.ToEnum <TableKinds>()) { case TableKinds.Expense: expenses.Add(entity.ToKind <IExpenseEntity>().ToModel()); break; } } return(expenses); } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.TraceInformation()); throw; } }
public IEnumerable <Expense> GetExpensesForApproval(string approverName) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; // This query is not effecient at all. Because we are not using PartionKey & RowKey we are // going to get a table scan. Best to create another table and use approver name as the // PartitionKey. var query = (from expense in context.ExpenseExpenseItem where expense.ApproverName.CompareTo(approverName) == 0 select expense).AsTableServiceQuery(); try { return(query.Execute().Select(e => e.ToKind <IExpenseEntity>().ToModel()).ToList()); } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.TraceInformation()); throw; } }
public IEnumerable<Expense> GetExpensesByUser(string username) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; char charAfterSeparator = Convert.ToChar((Convert.ToInt32('_') + 1)); var nextId = ExpenseEntity.RowKeyPrefix + charAfterSeparator; // The Take(10) is not intended as a paging mechanism. // It was added to improve the performance of the application. // Using the partition key in the query will improve the performance // because the partition key is indexed. var query = (from expense in context.ExpenseExpenseItem where expense.PartitionKey.CompareTo(username.EncodePartitionAndRowKey()) == 0 && expense.RowKey.CompareTo(ExpenseEntity.RowKeyPrefix) >= 0 && expense.RowKey.CompareTo(nextId) < 0 select expense).Take(10).AsTableServiceQuery(); try { var expenses = new List<Expense>(); foreach (var entity in query.Execute()) { switch (entity.ToEnum<TableKinds>()) { case TableKinds.Expense: expenses.Add(entity.ToKind<IExpenseEntity>().ToModel()); break; } } return expenses; } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.TraceInformation()); throw; } }
public Expense GetExpenseById(string username, string expenseId) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; string expenseRowKey = KeyGenerator.ExpenseEntityRowKey(expenseId); char charAfterSeparator = Convert.ToChar((Convert.ToInt32('_') + 1)); var nextExpenseRowId = expenseRowKey + charAfterSeparator; string expenseItemRowKey = string.Format(CultureInfo.InvariantCulture, "{0}{1}", ExpenseItemEntity.RowKeyPrefix, expenseId); var nextExpenseItemRowId = expenseItemRowKey + charAfterSeparator; // TODO: Update to only have to compare to the expense id key and not the entire row var expenseQuery = (from e in context.ExpenseExpenseItem where e.PartitionKey == username.EncodePartitionAndRowKey() && ((e.RowKey.CompareTo(expenseRowKey) >= 0 && e.RowKey.CompareTo(nextExpenseRowId) < 0) || (e.RowKey.CompareTo(expenseItemRowKey) >= 0 && e.RowKey.CompareTo(nextExpenseItemRowId) < 0)) select e).AsTableServiceQuery(); Expense expense = null; var items = new List <ExpenseItem>(); try { foreach (var entity in expenseQuery.Execute()) { switch (entity.ToEnum <TableKinds>()) { case TableKinds.Expense: expense = entity.ToKind <IExpenseEntity>().ToModel(); break; case TableKinds.ExpenseItem: items.Add(entity.ToKind <IExpenseItemEntity>().ToModel()); break; } } } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.Message); throw; } if (expense == null) { return(expense); } items.ForEach(x => expense.Details.Add(x)); var policy = new SharedAccessPolicy { Permissions = SharedAccessPermissions.Read, SharedAccessExpiryTime = DateTime.UtcNow + this.sharedSignatureValiditySpan }; var client = this.account.CreateCloudBlobClient(); var container = client.GetContainerReference(AzureStorageNames.ReceiptContainerName); foreach (var item in expense.Details) { if (item.ReceiptUrl != null) { CloudBlob receiptBlob = container.GetBlobReference(item.ReceiptUrl.ToString()); item.ReceiptUrl = new Uri(item.ReceiptUrl.AbsoluteUri + receiptBlob.GetSharedAccessSignature(policy)); } else { item.ReceiptUrl = new Uri("/Styling/Images/no_receipt.png", UriKind.Relative); } if (item.ReceiptThumbnailUrl != null) { CloudBlob receiptThumbnailBlob = container.GetBlobReference(item.ReceiptThumbnailUrl.ToString()); item.ReceiptThumbnailUrl = new Uri(item.ReceiptThumbnailUrl.AbsoluteUri + receiptThumbnailBlob.GetSharedAccessSignature(policy)); } else { item.ReceiptThumbnailUrl = new Uri("/Styling/Images/no_receipt.png", UriKind.Relative); } } return(expense); }
public IEnumerable<Expense> GetExpensesForApproval(string approverName) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; // This query is not effecient at all. Because we are not using PartionKey & RowKey we are // going to get a table scan. Best to create another table and use approver name as the // PartitionKey. var query = (from expense in context.ExpenseExpenseItem where expense.ApproverName.CompareTo(approverName) == 0 select expense).AsTableServiceQuery(); try { return query.Execute().Select(e => e.ToKind<IExpenseEntity>().ToModel()).ToList(); } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.TraceInformation()); throw; } }
public void SaveExpense(Expense expense) { var context = new ExpenseDataContext(this.account); ExpenseEntity expenseRow = expense.ToTableEntity(); foreach (var expenseItem in expense.Details) { var expenseItemRow = expenseItem.ToTableEntity(expenseRow.PartitionKey, expense.Id); context.AddObject(AzureStorageNames.ExpenseTable, expenseItemRow); } context.AddObject(AzureStorageNames.ExpenseTable, expenseRow); context.SaveChanges(SaveChangesOptions.Batch); foreach (var expenseItem in expense.Details) { // save receipt image if any if (expenseItem.Receipt != null && expenseItem.Receipt.Length > 0) { this.receiptStorage.AddReceipt(expenseItem.Id, expenseItem.Receipt, string.Empty); var queue = new AzureQueue<NewReceiptMessage>(this.account, AzureStorageNames.NewReceiptMessage); queue.AddMessage(new NewReceiptMessage { ExpenseItemId = expenseItem.Id, ExpenseId = expense.Id, Username = expense.UserName }); } } }
public void UpdateApproved(Expense expense) { var context = new ExpenseDataContext(this.account); IExpenseEntity expenseRow = GetExpenseRowById(context, expense.UserName, expense.Id); expenseRow.Approved = expense.Approved; var queue = new AzureQueue<ApprovedExpenseMessage>(this.account, AzureStorageNames.ApprovedExpenseMessage); queue.AddMessage(new ApprovedExpenseMessage { ExpenseId = expense.Id, ApproveDate = DateTime.UtcNow, Username = expense.UserName }); context.UpdateObject(expenseRow); context.SaveChanges(); }
public Expense GetExpenseById(string username, string expenseId) { var context = new ExpenseDataContext(this.account) { MergeOption = MergeOption.NoTracking }; string expenseRowKey = KeyGenerator.ExpenseEntityRowKey(expenseId); char charAfterSeparator = Convert.ToChar((Convert.ToInt32('_') + 1)); var nextExpenseRowId = expenseRowKey + charAfterSeparator; string expenseItemRowKey = string.Format(CultureInfo.InvariantCulture, "{0}{1}", ExpenseItemEntity.RowKeyPrefix, expenseId); var nextExpenseItemRowId = expenseItemRowKey + charAfterSeparator; // TODO: Update to only have to compare to the expense id key and not the entire row var expenseQuery = (from e in context.ExpenseExpenseItem where e.PartitionKey == username.EncodePartitionAndRowKey() && ((e.RowKey.CompareTo(expenseRowKey) >= 0 && e.RowKey.CompareTo(nextExpenseRowId) < 0) || (e.RowKey.CompareTo(expenseItemRowKey) >= 0 && e.RowKey.CompareTo(nextExpenseItemRowId) < 0)) select e).AsTableServiceQuery(); Expense expense = null; var items = new List<ExpenseItem>(); try { foreach (var entity in expenseQuery.Execute()) { switch (entity.ToEnum<TableKinds>()) { case TableKinds.Expense: expense = entity.ToKind<IExpenseEntity>().ToModel(); break; case TableKinds.ExpenseItem: items.Add(entity.ToKind<IExpenseItemEntity>().ToModel()); break; } } } catch (InvalidOperationException e) { Log.Write(EventKind.Error, e.Message); throw; } if (expense == null) { return expense; } items.ForEach(x => expense.Details.Add(x)); var policy = new SharedAccessPolicy { Permissions = SharedAccessPermissions.Read, SharedAccessExpiryTime = DateTime.UtcNow + this.sharedSignatureValiditySpan }; var client = this.account.CreateCloudBlobClient(); var container = client.GetContainerReference(AzureStorageNames.ReceiptContainerName); foreach (var item in expense.Details) { if (item.ReceiptUrl != null) { CloudBlob receiptBlob = container.GetBlobReference(item.ReceiptUrl.ToString()); item.ReceiptUrl = new Uri(item.ReceiptUrl.AbsoluteUri + receiptBlob.GetSharedAccessSignature(policy)); } else { item.ReceiptUrl = new Uri("/Styling/Images/no_receipt.png", UriKind.Relative); } if (item.ReceiptThumbnailUrl != null) { CloudBlob receiptThumbnailBlob = container.GetBlobReference(item.ReceiptThumbnailUrl.ToString()); item.ReceiptThumbnailUrl = new Uri(item.ReceiptThumbnailUrl.AbsoluteUri + receiptThumbnailBlob.GetSharedAccessSignature(policy)); } else { item.ReceiptThumbnailUrl = new Uri("/Styling/Images/no_receipt.png", UriKind.Relative); } } return expense; }
private static IExpenseEntity GetExpenseRowById(ExpenseDataContext context, string username, string expenseRowKey) { var query = (from expense in context.ExpenseExpenseItem where expense.PartitionKey == username.EncodePartitionAndRowKey() && expense.RowKey == KeyGenerator.ExpenseEntityRowKey(expenseRowKey) select expense).AsTableServiceQuery(); return query.Execute().SingleOrDefault().ToKind<IExpenseEntity>(); }