Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions Contacts.API/Contacts.API.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="11.11.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="12.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="9.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="7.2.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.45.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
</ItemGroup>

<ItemGroup>
Expand Down
3 changes: 2 additions & 1 deletion Contacts.API/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.OpenApi.Models;
using AutoMapper;

namespace Contacts.API;

Expand Down Expand Up @@ -53,7 +54,7 @@ public void ConfigureServices(IServiceCollection services)

ContactPartitionKeyProvider partitionKeyProvider = new();

services.AddAutoMapper(typeof(ContactsProfile));
services.AddAutoMapper(cfg => { }, typeof(ContactsProfile));
services.AddValidatorsFromAssembly(typeof(CreateContactCommandValidator).Assembly);

services.AddSingleton(container)
Expand Down
7 changes: 4 additions & 3 deletions Contacts.Application/Contacts.Application.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="FluentValidation" Version="11.11.0" />
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="AutoMapper" Version="15.0.1" />
<PackageReference Include="FluentValidation" Version="12.0.0" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>

<ItemGroup>
Expand Down
4 changes: 2 additions & 2 deletions Contacts.Domain/Contacts.Domain.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>

</Project>
7 changes: 4 additions & 3 deletions Contacts.EventsProcessor/Contacts.EventsProcessor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.18.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.45.2" />
<PackageReference Include="Azure.Messaging.ServiceBus" Version="7.20.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.10" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>
</Project>
5 changes: 3 additions & 2 deletions Contacts.Infrastructure/Contacts.Infrastructure.csproj
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.45.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.10" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
</ItemGroup>

<ItemGroup>
Expand Down
21 changes: 11 additions & 10 deletions Contacts.Tests/Contacts.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="FluentValidation" Version="11.11.0" />
<PackageReference Include="MediatR" Version="12.4.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.45.2" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
<PackageReference Include="FluentValidation" Version="12.0.0" />
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.54.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.10" />
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.10" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.10" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.10" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="18.0.0" />
<PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.1">
<PackageReference Include="xunit.runner.visualstudio" Version="3.1.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.3">
<PackageReference Include="coverlet.collector" Version="6.0.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
Expand Down
141 changes: 75 additions & 66 deletions Deployment/deploy.bicep
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
param location string = resourceGroup().location

// Cosmos DB Account
resource cosmosDbAccount 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' = {
resource cosmosDbAccount 'Microsoft.DocumentDB/databaseAccounts@2025-04-15' = {
name: 'cosmos-tobp-${uniqueString(resourceGroup().id)}'
location: location
kind: 'GlobalDocumentDB'
Expand All @@ -22,7 +22,7 @@ resource cosmosDbAccount 'Microsoft.DocumentDB/databaseAccounts@2024-05-15' = {
}

// Cosmos DB
resource cosmosDbDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2024-05-15' = {
resource cosmosDbDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@2025-04-15' = {
parent: cosmosDbAccount
name: 'tobp'
location: location
Expand All @@ -39,7 +39,7 @@ resource cosmosDbDatabase 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases@20
}

// Data Container
resource containerData 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-05-15' = {
resource containerData 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2025-04-15' = {
parent: cosmosDbDatabase
name: 'data'
location: location
Expand Down Expand Up @@ -72,7 +72,7 @@ resource containerData 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/conta
}

// Leases Container
resource containerLeases 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2024-05-15' = {
resource containerLeases 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers@2025-04-15' = {
parent: cosmosDbDatabase
name: 'leases'
location: location
Expand Down Expand Up @@ -104,7 +104,7 @@ resource containerLeases 'Microsoft.DocumentDB/databaseAccounts/sqlDatabases/con
}

// ServiceBus
resource sb 'Microsoft.ServiceBus/namespaces@2021-11-01' = {
resource sb 'Microsoft.ServiceBus/namespaces@2024-01-01' = {
name: 'sb-tobp-${uniqueString(resourceGroup().id)}'
location: location
sku: {
Expand All @@ -126,7 +126,7 @@ resource sb 'Microsoft.ServiceBus/namespaces@2021-11-01' = {
enableExpress: false
}

resource sbtTestSubscription 'subscriptions@2021-11-01' = {
resource sbtTestSubscription 'subscriptions@2024-01-01' = {
name: 'testSubscription'
properties: {
lockDuration: 'PT5M'
Expand All @@ -141,18 +141,9 @@ resource sb 'Microsoft.ServiceBus/namespaces@2021-11-01' = {
}
}

// Storage Account for Function
resource stgForFunctions 'Microsoft.Storage/storageAccounts@2023-05-01' = {
name: 'stfn${take(uniqueString(resourceGroup().id), 11)}'
location: location
kind: 'StorageV2'
sku: {
name: 'Standard_LRS'
}
}

// ApplicationInsights
resource workspace 'Microsoft.OperationalInsights/workspaces@2023-09-01' = {
resource workspace 'Microsoft.OperationalInsights/workspaces@2025-02-01' = {
name: 'ws-tobp-${uniqueString(resourceGroup().id)}'
location: location
properties: {
Expand All @@ -172,89 +163,106 @@ resource appi 'Microsoft.Insights/components@2020-02-02' = {
}
}

// Dynamic Hostingplan
resource hostingPlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: 'plan-tobp-${uniqueString(resourceGroup().id)}'
// Storage Account for Azure Function
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-01-01' = {
name: 'st${replace(uniqueString(resourceGroup().id), '-', '')}'
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'StorageV2'
properties: {
accessTier: 'Hot'
}
}

// App Service Plan for Azure Function
resource functionAppServicePlan 'Microsoft.Web/serverfarms@2024-11-01' = {
name: 'asp-func-tobp-${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: 'Y1'
tier: 'Dynamic'
}
properties: {}
properties: {
reserved: false
}
}

// Function App
resource functionApp 'Microsoft.Web/sites@2023-12-01' = {
name: 'funcapp-tobp-${uniqueString(resourceGroup().id)}'
// Azure Function App
resource functionApp 'Microsoft.Web/sites@2024-11-01' = {
name: 'func-tobp-${uniqueString(resourceGroup().id)}'
location: location
kind: 'functionapp'
properties: {
httpsOnly: true
serverFarmId: hostingPlan.id
serverFarmId: functionAppServicePlan.id
siteConfig: {
appSettings: [
{
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: appi.properties.InstrumentationKey
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'AzureWebJobsStorage'
value: 'DefaultEndpointsProtocol=https;AccountName=${stgForFunctions.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${stgForFunctions.listKeys().keys[0].value}'
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
}
{
name: 'WEBSITE_CONTENTSHARE'
value: toLower('func-tobp-${uniqueString(resourceGroup().id)}')
}
{
name: 'FUNCTIONS_EXTENSION_VERSION'
value: '~4'
}
{
name: 'FUNCTIONS_WORKER_RUNTIME'
value: 'dotnet'
value: 'dotnet-isolated'
}
{
name: 'SERVICEBUS_CONNECTION'
value: '${listKeys('${sb.id}/AuthorizationRules/RootManageSharedAccessKey', sb.apiVersion).primaryConnectionString}'
name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
value: appi.properties.InstrumentationKey
}
{
name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
value: 'DefaultEndpointsProtocol=https;AccountName=${stgForFunctions.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${stgForFunctions.listKeys().keys[0].value}'
name: 'APPLICATIONINSIGHTS_CONNECTION_STRING'
value: appi.properties.ConnectionString
}
{
name: 'Cosmos:Url'
value: 'https://${cosmosDbAccount.name}.documents.azure.com:443/'
}
{
name: 'Cosmos:Key'
value: listKeys('${cosmosDbAccount.id}', cosmosDbAccount.apiVersion).primaryMasterKey
}
]
}
}
}

// Function
resource function 'Microsoft.Web/sites/functions@2023-12-01' = {
parent: functionApp
name: 'funcapp-tobp-${uniqueString(resourceGroup().id)}'
properties: {
function_app_id: functionApp.id
config: {
bindings: [
{
name: 'mySbMsg'
type: 'serviceBusTrigger'
direction: 'in'
topicName: 'sbt-contacts'
subscriptionName: 'testSubscription'
connection: 'SERVICEBUS_CONNECTION'
isSessionsEnabled: true
name: 'Cosmos:Db'
value: 'tobp'
}
{
name: 'Cosmos:Container'
value: 'data'
}
{
name: 'Events:Ttl'
value: '864000'
}
{
name: 'ServiceBus:ConnectionString'
value: listKeys('${sb.id}/AuthorizationRules/RootManageSharedAccessKey', sb.apiVersion).primaryConnectionString
}
]
netFrameworkVersion: 'v8.0'
use32BitWorkerProcess: false
cors: {
allowedOrigins: [
'https://portal.azure.com'
]
}
}
files: {
'run.csx': '''using System;
using System.Threading.Tasks;

public static void Run(string mySbMsg, ILogger log)
{
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg}");
}'''
}

}
}

resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
resource appServicePlan 'Microsoft.Web/serverfarms@2024-11-01' = {
name: 'appservice-tobp-${uniqueString(resourceGroup().id)}'
location: location
sku: {
Expand All @@ -264,7 +272,7 @@ resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
properties: {}
}

resource appService 'Microsoft.Web/sites@2023-12-01' = {
resource appService 'Microsoft.Web/sites@2024-11-01' = {
name: 'webapp-tobp-${uniqueString(resourceGroup().id)}'
location: location
properties: {
Expand Down Expand Up @@ -309,3 +317,4 @@ output cosmosUri string = 'https://${cosmosDbAccount.name}.documents.azure.com:4
output cosmosDbName string = 'tobp'
output cosmosDbDataContainerName string = 'data'
output cosmosDbLeasesContainerName string = 'leases'
output functionAppName string = functionApp.name
2 changes: 1 addition & 1 deletion global.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "8.0.0",
"version": "8.0.413",
"rollForward": "minor",
"allowPrerelease": false
}
Expand Down
Loading