templates/todo/api/csharp-cosmos-sql/ListsRepository.cs (96 lines of code) (raw):

using Microsoft.Azure.Cosmos; using Microsoft.Azure.Cosmos.Linq; namespace SimpleTodo.Api; public class ListsRepository { private readonly Container _listsCollection; private readonly Container _itemsCollection; public ListsRepository(CosmosClient client, IConfiguration configuration) { var database = client.GetDatabase(configuration["AZURE_COSMOS_DATABASE_NAME"]); _listsCollection = database.GetContainer("TodoList"); _itemsCollection = database.GetContainer("TodoItem"); } public async Task<IEnumerable<TodoList>> GetListsAsync(int? skip, int? batchSize) { return await ToListAsync( _listsCollection.GetItemLinqQueryable<TodoList>(), skip, batchSize); } public async Task<TodoList?> GetListAsync(string listId) { var response = await _listsCollection.ReadItemAsync<TodoList>(listId, new PartitionKey(listId)); return response?.Resource; } public async Task DeleteListAsync(string listId) { await _listsCollection.DeleteItemAsync<TodoList>(listId, new PartitionKey(listId)); } public async Task AddListAsync(TodoList list) { list.Id = Guid.NewGuid().ToString("N"); await _listsCollection.UpsertItemAsync(list, new PartitionKey(list.Id)); } public async Task UpdateList(TodoList existingList) { await _listsCollection.ReplaceItemAsync(existingList, existingList.Id, new PartitionKey(existingList.Id)); } public async Task<IEnumerable<TodoItem>> GetListItemsAsync(string listId, int? skip, int? batchSize) { return await ToListAsync( _itemsCollection.GetItemLinqQueryable<TodoItem>().Where(i => i.ListId == listId), skip, batchSize); } public async Task<IEnumerable<TodoItem>> GetListItemsByStateAsync(string listId, string state, int? skip, int? batchSize) { return await ToListAsync( _itemsCollection.GetItemLinqQueryable<TodoItem>().Where(i => i.ListId == listId && i.State == state), skip, batchSize); } public async Task AddListItemAsync(TodoItem item) { item.Id = Guid.NewGuid().ToString("N"); await _itemsCollection.UpsertItemAsync(item, new PartitionKey(item.Id)); } public async Task<TodoItem?> GetListItemAsync(string listId, string itemId) { var response = await _itemsCollection.ReadItemAsync<TodoItem>(itemId, new PartitionKey(itemId)); if (response?.Resource.ListId != listId) { return null; } return response.Resource; } public async Task DeleteListItemAsync(string listId, string itemId) { await _itemsCollection.DeleteItemAsync<TodoItem>(itemId, new PartitionKey(itemId)); } public async Task UpdateListItem(TodoItem existingItem) { await _itemsCollection.ReplaceItemAsync(existingItem, existingItem.Id, new PartitionKey(existingItem.Id)); } private async Task<List<T>> ToListAsync<T>(IQueryable<T> queryable, int? skip, int? batchSize) { if (skip != null) { queryable = queryable.Skip(skip.Value); } if (batchSize != null) { queryable = queryable.Take(batchSize.Value); } using FeedIterator<T> iterator = queryable.ToFeedIterator(); var items = new List<T>(); while (iterator.HasMoreResults) { foreach (var item in await iterator.ReadNextAsync()) { items.Add(item); } } return items; } }