diff --git a/.github/workflows/azure-static-web-apps-witty-sand-05efbb40f.yml b/.github/workflows/azure-static-web-apps-witty-sand-05efbb40f.yml
new file mode 100644
index 00000000..11b2de30
--- /dev/null
+++ b/.github/workflows/azure-static-web-apps-witty-sand-05efbb40f.yml
@@ -0,0 +1,45 @@
+name: Azure Static Web Apps CI/CD
+
+on:
+ push:
+ branches:
+ - dev-v3
+ pull_request:
+ types: [opened, synchronize, reopened, closed]
+ branches:
+ - dev-v3
+
+jobs:
+ build_and_deploy_job:
+ if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
+ runs-on: ubuntu-latest
+ name: Build and Deploy Job
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ submodules: true
+ - name: Build And Deploy
+ id: builddeploy
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_WITTY_SAND_05EFBB40F }}
+ repo_token: ${{ secrets.GITHUB_TOKEN }} # Used for Github integrations (i.e. PR comments)
+ action: "upload"
+ ###### Repository/Build Configurations - These values can be configured to match your app requirements. ######
+ # For more information regarding Static Web App workflow configurations, please visit: https://aka.ms/swaworkflowconfig
+ app_location: "src/app/TinyBlazorAdmin" # App source code path
+ api_location: "src/api/shortenerTools" # Api source code path - optional
+ output_location: "wwwroot" # Built app content directory - optional
+ ###### End of Repository/Build Configurations ######
+
+ close_pull_request_job:
+ if: github.event_name == 'pull_request' && github.event.action == 'closed'
+ runs-on: ubuntu-latest
+ name: Close Pull Request Job
+ steps:
+ - name: Close Pull Request
+ id: closepullrequest
+ uses: Azure/static-web-apps-deploy@v1
+ with:
+ azure_static_web_apps_api_token: ${{ secrets.AZURE_STATIC_WEB_APPS_API_TOKEN_WITTY_SAND_05EFBB40F }}
+ action: "close"
diff --git a/.gitignore b/.gitignore
index a65c04c3..e162cee5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -265,9 +265,5 @@ __pycache__/
**/appsettings.[Dd]evelopment.json
-src/adminTools/adminBlazorWebsite/appsettings.Development.json
-
-src/adminTools/adminBlazorWebsite/src/appsettings.Development.json
-
#Igniore VSCode User Setting
**/.vscode/settings.json
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index 5c7247b4..00000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- // Use IntelliSense to learn about possible attributes.
- // Hover to view descriptions of existing attributes.
- // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
- "version": "0.2.0",
- "configurations": []
-}
\ No newline at end of file
diff --git a/AzUrlShortener.sln.DotSettings b/AzUrlShortener.sln.DotSettings
new file mode 100644
index 00000000..d93281c4
--- /dev/null
+++ b/AzUrlShortener.sln.DotSettings
@@ -0,0 +1,4 @@
+
+ True
+ True
+ True
\ No newline at end of file
diff --git a/README.md b/README.md
index 9680a5fb..270f4c52 100644
--- a/README.md
+++ b/README.md
@@ -19,6 +19,7 @@ Features:
- Create Edit and Delete short URL.
- Redirect different destination base on schedules
- Keep Statistics of your clicks.
+ - Click statistics by country
- Budget-friendly and 100% open-source.
- Secure by Azure Active Directory AAD (Microsoft Identity)
- Simple step by step deployment
@@ -37,9 +38,6 @@ If you want to **Update** or **Upgrade**, please refer to [this page](https://gi
## How To Use It
-There are many different ways to manage your Short Urls, from a direct HTTP call to a fancy website.
-[See the complete list of admin frontends here](src/adminTools/README.md), with the instructions to deploy and use them.
-
There is also a video that does a quick tour of the project.
[](https://youtu.be/fzXy2D77WMM)
@@ -82,7 +80,6 @@ If you find a bug or would like to add a feature, check out those resources:
Check out our [Code of Conduct](CODE_OF_CONDUCT.md) and [Contributing](CONTRIBUTING.md) docs. This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
-There is also instructions or [guidance](src/adminTools/README.md#how-to-add-a-new-frontend) if you would like to create a new one and collaborate to this project.
## Contributors ✨
diff --git a/deployment/azureDeploy.json b/deployment/azureDeploy.json
index 9be6416c..22364158 100644
--- a/deployment/azureDeploy.json
+++ b/deployment/azureDeploy.json
@@ -10,13 +10,13 @@
}
},
"frontend": {
- "type": "string",
- "allowedValues": [
- "none",
- "adminBlazorWebsite"
- ],
- "defaultValue": "adminBlazorWebsite",
- "metadata": {
+ "type": "string",
+ "allowedValues": [
+ "none",
+ "adminBlazorWebsite"
+ ],
+ "defaultValue": "adminBlazorWebsite",
+ "metadata": {
"description": "Select the frontend that will be deploy. Select 'none', if you don't want any. Frontend available: adminBlazorWebsite, none. "
}
},
@@ -27,6 +27,13 @@
"description": "Default URL use when the key pass by the user is not found."
}
},
+ "ipLocationServiceUrl": {
+ "defaultValue": "",
+ "type": "string",
+ "metadata": {
+ "description": "Default URL for the ip location service."
+ }
+ },
"GitHubURL": {
"type": "string",
"defaultValue": "https://github.com/fboucher/AzUrlShortener.git",
@@ -41,50 +48,48 @@
"description": "Name of the branch to use when deploying (Default = main)."
}
},
- "ExpireOn":{
- "type":"string",
- "defaultValue":"[utcNow('yyyy-MM-dd')]",
+ "ExpireOn": {
+ "type": "string",
+ "defaultValue": "[utcNow('yyyy-MM-dd')]",
"metadata": {
"description": "Just a text value (format: yyyy-MM-dd) that express when it is safe to delete these resources"
}
},
- "OwnerName":{
- "type":"string",
+ "OwnerName": {
+ "type": "string",
"defaultValue": "",
"metadata": {
"description": "Owner of this deployment, person to contact for question."
}
},
"frontend-AdminEMail": {
- "type": "string",
- "defaultValue": "",
- "metadata": {
+ "type": "string",
+ "defaultValue": "",
+ "metadata": {
"description": "(Required only if frontend = adminBlazorWebsite) The EMail use to connect into the admin Blazor Website."
}
},
"frontend-AdminPassword": {
- "type": "securestring",
- "defaultValue": "",
- "metadata": {
+ "type": "securestring",
+ "defaultValue": "",
+ "metadata": {
"description": "(Required only if frontend = adminBlazorWebsite) Password use to connect into the admin Blazor Website. It MOST have: an uppercase character,a lowercase character, a digit, a non-alphanumeric character, must be at least six (6) characters long."
}
}
},
- "variables":{
+ "variables": {
"suffix": "[substring(toLower(uniqueString(resourceGroup().id, resourceGroup().location)),0,5)]",
"funcAppName": "[toLower(concat(parameters('baseName'), variables('suffix')))]",
"funcStorageAccountName": "[tolower(concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),16)), variables('suffix'), 'stg'))]",
"funcHhostingPlanName": "[concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),14)), variables('suffix'), 'plan')]",
- "insightsAppName":"[concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),14)), variables('suffix'), '-meta')]",
+ "insightsAppName": "[concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),14)), variables('suffix'), '-meta')]",
"functionProjectFolder": "src/shortenerTools",
"UrlsStorageAccountName": "[concat('urldata', variables('suffix'), 'stg')]",
"frontendInfo": {
- "adminBlazorWebsite": {
- "armTemplateUrl": "[concat('https://raw.githubusercontent.com/FBoucher/AzUrlShortener/', parameters('GitHubBranch'), '/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json')]"
- }
+ "adminBlazorWebsite": {
+ "armTemplateUrl": "[concat('https://raw.githubusercontent.com/FBoucher/AzUrlShortener/', parameters('GitHubBranch'), '/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json')]"
+ }
}
-
-
},
"resources": [
{
@@ -150,20 +155,24 @@
{
"name": "defaultRedirectUrl",
"value": "[parameters('defaultRedirectUrl')]"
+ },
+ {
+ "name": "IpLocationService:Url",
+ "value": "[parameters('ipLocationServiceUrl')]"
}
]
},
- "serverFarmId": "[resourceId('Microsoft.Web/serverfarms/', variables('funcHhostingPlanName'))]",
+ "serverFarmId": "[resourceId('Microsoft.Web/serverfarms/', variables('funcHhostingPlanName'))]",
"hostingEnvironment": "",
"clientAffinityEnabled": true
},
"resources": [
{
"apiVersion": "2018-11-01",
- "type":"sourcecontrols",
+ "type": "sourcecontrols",
"name": "web",
"dependsOn": [
- "[resourceId('Microsoft.Web/sites/', variables('funcAppName'))]"
+ "[resourceId('Microsoft.Web/sites/', variables('funcAppName'))]"
],
"properties": {
"repoUrl": "[parameters('GitHubURL')]",
@@ -254,36 +263,36 @@
},
"parameters": {
"basename": {
- "value" : "[concat('adm', parameters('baseName'))]"
+ "value": "[concat('adm', parameters('baseName'))]"
},
"AdminEMail": {
- "value" : "[parameters('frontend-AdminEMail')]"
+ "value": "[parameters('frontend-AdminEMail')]"
},
"AdminPassword": {
- "value" : "[parameters('frontend-AdminPassword')]"
+ "value": "[parameters('frontend-AdminPassword')]"
},
"AzureFunctionUrl": {
- "value" : "[concat('https://', reference(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '2018-02-01').hostNames[0])]"
+ "value": "[concat('https://', reference(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '2018-02-01').hostNames[0])]"
},
"SecurityCode": {
- "value" : "[listkeys(concat(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '/host/default/'),'2016-08-01').functionKeys.default]"
+ "value": "[listkeys(concat(resourceId('Microsoft.Web/sites/', variables('funcAppName')), '/host/default/'),'2016-08-01').functionKeys.default]"
},
"GitHubURL": {
- "value" : "[parameters('GitHubURL')]"
+ "value": "[parameters('GitHubURL')]"
},
"GitHubBranch": {
- "value" : "[parameters('GitHubBranch')]"
+ "value": "[parameters('GitHubBranch')]"
},
"ExpireOn": {
- "value" : "[parameters('ExpireOn')]"
+ "value": "[parameters('ExpireOn')]"
},
"OwnerName": {
- "value" : "[parameters('OwnerName')]"
+ "value": "[parameters('OwnerName')]"
}
}
}
}
],
- "outputs":{}
+ "outputs": {}
}
\ No newline at end of file
diff --git a/deployment/azureDeploy.params.json b/deployment/azureDeploy.params.json
index d4e7b66d..2deb8962 100644
--- a/deployment/azureDeploy.params.json
+++ b/deployment/azureDeploy.params.json
@@ -5,23 +5,26 @@
"baseName": {
"value": "AzUrlShortTools"
},
- "OwnerName": {
- "value": "Frank"
- },
- "GitHubBranch": {
- "value": "feature/deploy-it-all"
- },
+ "OwnerName": {
+ "value": "Frank"
+ },
+ "GitHubBranch": {
+ "value": "feature/deploy-it-all"
+ },
"defaultRedirectUrl": {
"value": "https://azure.com"
},
+ "ipLocationServiceUrl": {
+ "value": "https://freegeoip.app/"
+ },
"frontend": {
"value": "adminBlazorWebsite"
},
- "frontend-AdminEMail": {
- "value": "test@test.com"
- },
- "frontend-AdminPassword": {
- "value": "Supernewt42!"
- }
+ "frontend-AdminEMail": {
+ "value": "test@test.com"
+ },
+ "frontend-AdminPassword": {
+ "value": "Supernewt42!"
+ }
}
}
\ No newline at end of file
diff --git a/deployment/debug.azcli b/deployment/debug.azcli
index 45336b0b..a9eea99b 100644
--- a/deployment/debug.azcli
+++ b/deployment/debug.azcli
@@ -12,7 +12,7 @@ az group deployment create -g c5mShortDemo -n cloud5minsv1 --template-file "dep
#debug adminBlazorWebsite
-az group deployment validate -g c5mShortDemo --template-file "src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json" --parameters "src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.params.json" --verbose
+#az group deployment validate -g c5mShortDemo --template-file "src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json" --parameters "src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.params.json" --verbose
az group deployment create -g c5mShortDemo -n cloud5minsv1 --template-file "deployment/azureDeploy.json" --parameters "deployment/azureDeploy.params.json" --verbose
diff --git a/src/adminTools/PowerAutomateFlow/README.md b/src/adminTools/PowerAutomateFlow/README.md
deleted file mode 100644
index f0b6b5b8..00000000
--- a/src/adminTools/PowerAutomateFlow/README.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# PowerAutomate Flow
-Like in postman you can also just use PowerAutomate Flows to create, update or archive or get all configured Urls.
-
-The flows call the Azure Functions.
-
-> The PowerAutomate Flows require a premium license (e.g. a per user license) to use the premium connectors.
-
-
-## Deployment
-You should have already deployed your version of the **Azure Url Shortener**
-
-### Flow 1 - Create new ShortURL
-[AzUrlShortener] - Create new ShortURL: [Download and import Flow](deployment/[AzUrlShortener]-CreatenewShortURL_20200621211731.zip)
-
-When you open the new imported Flow you need to set the correct HTTP Url to the Azure Function.
-
-
-
-For that goto your Azure Function App Service and copy the Url for the **UrlShortener** Azure Function.
-
-
-
-When you run the Flow and you have set the correct URL to the Azure Function your new ShortUrl is created and returned in the HTTP call:
-
-
-
-### Flow 2 - Get all URLs
-[AzUrlShortener] - Get all Urls: [Download and import Flow](deployment/[AzUrlShortener]-GetallURLs_20200621214422.zip)
-
-
-### Flow 3/4 - Update/Archive Url
-Manual update or archive is not implemented as it requires to pass a few parameter which not be known (The update Flow can be done of course, it's implemented in the SharePoint list)
-Parameters to pass (e.g. to change the long Url):
-- new Url
-- RowKey
-- PartitionKey
-- Vanity
-
-Parameters to pass to archive a Url
-- RowKey
-- PartitionKey
-- Vanity
-
-
----
-
-
-## How to use it
-Import the Flows and run them
-
-
----
-
-
-## Question, problem?
-
-If you have question or encounter any problem using this admin Frontend with AzShortenerUrl please feel free to ask help in the [issues section](https://github.com/FBoucher/AzUrlShortener/issues).
-
-
-[adminBlazorWebsite_Url_list]: medias/adminBlazorWebsite_Url_list.png
-[adminBlazorWebsite_Add_Url]: medias/adminBlazorWebsite_Add_Url.png
-[portalConfig]: medias/portalConfig.png
diff --git a/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-CreatenewShortURL_20200621211731.zip b/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-CreatenewShortURL_20200621211731.zip
deleted file mode 100644
index 5a8c590d..00000000
Binary files a/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-CreatenewShortURL_20200621211731.zip and /dev/null differ
diff --git a/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-GetallURLs_20200621214422.zip b/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-GetallURLs_20200621214422.zip
deleted file mode 100644
index b47994e7..00000000
Binary files a/src/adminTools/PowerAutomateFlow/deployment/[AzUrlShortener]-GetallURLs_20200621214422.zip and /dev/null differ
diff --git a/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL1.jpg b/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL1.jpg
deleted file mode 100644
index 38adb153..00000000
Binary files a/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL1.jpg and /dev/null differ
diff --git a/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL2.jpg b/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL2.jpg
deleted file mode 100644
index 601c92f3..00000000
Binary files a/src/adminTools/PowerAutomateFlow/medias/GetAzureFunctionURL2.jpg and /dev/null differ
diff --git a/src/adminTools/PowerAutomateFlow/medias/Result_CreateShortUrl.jpg b/src/adminTools/PowerAutomateFlow/medias/Result_CreateShortUrl.jpg
deleted file mode 100644
index 05e54acc..00000000
Binary files a/src/adminTools/PowerAutomateFlow/medias/Result_CreateShortUrl.jpg and /dev/null differ
diff --git a/src/adminTools/PowerAutomateFlow/medias/UpdateFlow_HTTPCall_with_AzureFunctionUrl.jpg b/src/adminTools/PowerAutomateFlow/medias/UpdateFlow_HTTPCall_with_AzureFunctionUrl.jpg
deleted file mode 100644
index 0deab652..00000000
Binary files a/src/adminTools/PowerAutomateFlow/medias/UpdateFlow_HTTPCall_with_AzureFunctionUrl.jpg and /dev/null differ
diff --git a/src/adminTools/PowerShell/README.md b/src/adminTools/PowerShell/README.md
deleted file mode 100644
index 78f7678c..00000000
--- a/src/adminTools/PowerShell/README.md
+++ /dev/null
@@ -1,184 +0,0 @@
-# PowerShell
-
-## Deployment
-
-PowerShell is available out of the box with every Windows 10 installation, so there is no deployment needed.
-Just type "PowerShell" via Windows Start button to start either the "Windows PowerShell" command window or the "Windows PowerShell ISE"
-
-## How to use it
-Get the Azure Function URL and run the PowerShell command (as long as the Azure Function doesn't require a login...)
-
-You will need to create a request for each functions. Here some requirements:
-
-- Set the request e.g. to POST.
-- Add a header: Content-Type = application/json
-- Use the URL **WITH** the security `Code` to call the Azure Function. ([Read here](https://github.com/FBoucher/AzUrlShortener/blob/feature/docs/post-deployment-configuration.md#how-to-get-the-azure-function-urls) to learn how to get the URLs )
-
-
-See full examples in provided PowerShell file:
-PowerShell with all commands: [PowerShell_Create_List_Update_Archive_ShortURLs.ps1](src/PowerShell_Create_List_Update_Archive_ShortURLs.ps1)
-
-
-### 1a- Create a short Url
-
-In PowerShell, use the URL from the **UrlShortener** Azure Function. In the body of the request, add a JSON document containing two properties.
-
-See the examples bellow to create short generic URL.
-
-```powershell
-#CREATE new ShortURL
-$Body = @{
- title = "Microsoft"
- url = "https://www.microsoft.com"
- vanity = ""
-}
-```
-
-If you prefer you can pass a `vanity` to have control on the end part of the Url. In this sample the vanity is `msft`.
-
-```powershell
-$Body = @{
- title = "Microsoft"
- url = "https://www.microsoft.com"
- vanity = "msft"
-}
-```
-
-To execute the call run this.
-```powershell
-$Parameters = @{
- Method = "POST"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlShortener?code=..."
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$newUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$newUrl
-```
-
-### 1b- Bulk Import short Urls from CSV file
-Create a csv file, e.g. name it BulkImportUrls.csv or save an excel file as csv.
-```csv
-title,url,vanity
-"Microsoft1","https://www.microsoft.com","msft1"
-"Microsoft2","https://www.microsoft.com"
-```
-
-Download BulkImportUrls.csv to start with: [BulkImportUrls.csv](src/BulkImportUrls.csv)
-
-Now run the
-[PowerShell_BulkImportUrls.ps1](src/PowerShell_BulkImportUrls.ps1) (maybe not the best PowerShell code but it does its job... You are welcome to enhance it to a more advanced PowerShell script, e.g. using function, etc)
-
-
-### 2- List all Urls
-
-Use the URL from the **UrlList** Azure Function. Set the request to GET. No body content is required for this request. However, make sure the url contains the security token `code`.
-
- https://shortenertools.azurewebsites.net/api/UrlList?code=JVzE6CvlEHxDHbq.....
-
-
-To execute the call:
-```powershell
-#GET all URls
-$Parameters = @{
- Method = "GET"
- Uri = "https://shortenertoolsn....azurewebsites.net/api/UrlList?code=..."
- ContentType = "application/json"
-}
-
-$allUrls = Invoke-RestMethod @Parameters | ConvertTo-Json
-$allUrls
-```
-
-The response will be a json document with an array:
-```json
-{
- "UrlList": [
- {
- "Url": "http://www.frankysnotes.com/2020/03/reading-notes-416.html",
- "PartitionKey": "2",
- "RowKey": "2r",
- "Timestamp": "2020-03-20T13:43:47.5758051+00:00",
- "ETag": "W/\"datetime'2020-03-20T13%3A43%3A47.5758051Z'\""
- },
- {
- "Url": "http://www.frankysnotes.com/2020/03/reading-notes-416.html",
- "PartitionKey": "t",
- "RowKey": "test10h24",
- "Timestamp": "2020-03-27T14:26:44.4342376+00:00",
- "ETag": "W/\"datetime'2020-03-27T14%3A26%3A44.4342376Z'\""
- },
- {
- "Url": "https://www.frankysnotes.com/2020/03/reading-notes-416.html",
- "PartitionKey": "z",
- "RowKey": "z10test",
- "Timestamp": "2020-03-20T15:27:08.8691188+00:00",
- "ETag": "W/\"datetime'2020-03-20T15%3A27%3A08.8691188Z'\""
- }
- ]
-}
-```
-
-### 3- Update entry
-
-Use the URL from the **Update** Azure Function.
-
- https://shortenertools.azurewebsites.net/api/UrlList?code=JVzE6CvlEHxDHbq.....
-
-
-To update an entry:
-```powershell
-#UPDATE ShortURL
-$Body = @{
- title = "Microsoft Homepage"
- url = "https://www.microsoft.com"
- RowKey = "msft"
- PartitionKey = "m"
- vanity = "msft"
-}
-
-$Parameters = @{
- Method = "POST"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlUpdate?code=..."
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$updUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$updUrl
-```
-
-### 4- Archive entry
-
-Use the URL from the **Archive** Azure Function.
-
- https://shortenertools.azurewebsites.net/api/UrlList?code=JVzE6CvlEHxDHbq.....
-
-
-To archive an entry:
-```powershell
-#ARCHIVE ShortURL
-$Body = @{
- RowKey = "msft"
- PartitionKey = "m"
- vanity = "msft"
-}
-
-#Currently Method is DELETE to Archive a ShortURL, with newest code version change it to POST
-$Parameters = @{
- Method = "DELETE"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlArchive?code="
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$archUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$archUrl
-```
-
-
-
-## Question, problem?
-
-If you have question or encounter any problem using this admin interface with AzShortenerUrl please feel free to ask help in the [issues section](https://github.com/FBoucher/AzUrlShortener/issues).
\ No newline at end of file
diff --git a/src/adminTools/PowerShell/medias/RunPowerShell.jpg b/src/adminTools/PowerShell/medias/RunPowerShell.jpg
deleted file mode 100644
index b4764915..00000000
Binary files a/src/adminTools/PowerShell/medias/RunPowerShell.jpg and /dev/null differ
diff --git a/src/adminTools/PowerShell/src/BulkImportUrls.csv b/src/adminTools/PowerShell/src/BulkImportUrls.csv
deleted file mode 100644
index beaaad0b..00000000
--- a/src/adminTools/PowerShell/src/BulkImportUrls.csv
+++ /dev/null
@@ -1,3 +0,0 @@
-title,url,vanity
-"Microsoft1","https://www.microsoft.com","msft1"
-"Microsoft2","https://www.microsoft.com"
\ No newline at end of file
diff --git a/src/adminTools/PowerShell/src/PowerShell_BulkImportUrls.ps1 b/src/adminTools/PowerShell/src/PowerShell_BulkImportUrls.ps1
deleted file mode 100644
index f396a1b7..00000000
--- a/src/adminTools/PowerShell/src/PowerShell_BulkImportUrls.ps1
+++ /dev/null
@@ -1,35 +0,0 @@
-#Example csv => BulkImportUrls.csv
-#as vanity is not mandatory just don't add a value for the vanity column like in the following Microsoft2 example
-#title,url,vanity
-#"Microsoft1","https://www.microsoft.com","msft1"
-#"Microsoft2","https://www.microsoft.com"
-
-$UrlValuesFromCSV = Import-CSV .\BulkImportUrls.csv
-<<<<<<< HEAD
-$AzureFunctionUrlShortenerUrl = "https://shortenertools....azurewebsites.net/api/UrlShortener?code=..."
-=======
-#$AzureFunctionUrlShortenerUrl = "https://shortenertools....azurewebsites.net/api/UrlShortener?code=..."
->>>>>>> PowerShell_BulkImport_CSV
-
-ForEach ($csventry in $UrlValuesFromCSV)
-{
- if (!$($csventry.vanity)) { $vanity = '' } else {$vanity = $($csventry.vanity)}
- $Body = @{
- title = $($csventry.title)
- url = $($csventry.url)
- vanity = $vanity
- }
-
- $Body
-
- $Parameters = @{
- Method = "POST"
- Uri = $AzureFunctionUrlShortenerUrl
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
- }
-
- $newUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
- $newUrl
-}
-
diff --git a/src/adminTools/PowerShell/src/PowerShell_Create_List_Update_Archive_ShortURLs.ps1 b/src/adminTools/PowerShell/src/PowerShell_Create_List_Update_Archive_ShortURLs.ps1
deleted file mode 100644
index dd4d7d66..00000000
--- a/src/adminTools/PowerShell/src/PowerShell_Create_List_Update_Archive_ShortURLs.ps1
+++ /dev/null
@@ -1,78 +0,0 @@
-#Calling a REST API from PowerShell
-#Idea from: https://4bes.nl/2020/08/23/calling-a-rest-api-from-powershell/amp/
-
-#GET all URls
-$Parameters = @{
- Method = "GET"
- Uri = "https://shortenertoolsn....azurewebsites.net/api/UrlList?code=..."
- ContentType = "application/json"
-}
-
-$allUrls = Invoke-RestMethod @Parameters | ConvertTo-Json
-$allUrls
-
-
-###############################################################
-
-
-#CREATE new ShortURL
-$Body = @{
- title = "Microsoft"
- url = "https://www.microsoft.com"
- vanity = "msft"
-}
-
-$Parameters = @{
- Method = "POST"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlShortener?code=..."
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$newUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$newUrl
-
-
-###############################################################
-
-
-#UPDATE ShortURL
-$Body = @{
- title = "Microsoft Homepage"
- url = "https://www.microsoft.com"
- RowKey = "msft"
- PartitionKey = "m"
- vanity = "msft"
-}
-
-$Parameters = @{
- Method = "POST"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlUpdate?code=..."
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$updUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$updUrl
-
-
-###############################################################
-
-
-#ARCHIVE ShortURL
-$Body = @{
- RowKey = "msft"
- PartitionKey = "m"
- vanity = "msft"
-}
-
-#Currently Method is DELETE to Archive a ShortURL, with newest code version change it to POST
-$Parameters = @{
- Method = "DELETE"
- Uri = "https://shortenertools....azurewebsites.net/api/UrlArchive?code="
- Body = ($Body | ConvertTo-Json)
- ContentType = "application/json"
-}
-
-$archUrl = Invoke-RestMethod @Parameters | ConvertTo-Json
-$archUrl
\ No newline at end of file
diff --git a/src/adminTools/README.md b/src/adminTools/README.md
deleted file mode 100644
index fc3e9bdb..00000000
--- a/src/adminTools/README.md
+++ /dev/null
@@ -1,88 +0,0 @@
-# Admin frontend for Azure Shortener Urls
-
-You just deployed the AzShortenerUrl backend (the Azure Functions), and now you would like to be able to create Urls! There is many different ways to calls those Azure Functions from a direct HTTP call to a fancy website.
-
-Here, you will find the list of all available frontend with the instructions to deploy and use them.
-
----
-
-## List of available Admin frontends
-
-
-### 1- [Postman](postman/README.md)
-
-Simple use of the API testing tool Postman to call the Azure Functions.
-
-
-
-More details [here](postman/README.md).
-
-
-### 2- [Admin Blazor Website](adminBlazorWebsite/README.md)
-
-A simple website that implement the basic functionalities. You can list all URLs and create new ones. The website is done using Asp .Net Core Blazor with a server side. It can be deploy in Azure with one-click deployment.
-
-
-
-More details [here](adminBlazorWebsite/README.md).
-
-
-### 3- [TinyBlazorAdmin Website](https://github.com/FBoucher/TinyBlazorAdmin)
-Admin tools for Azure Url Shortener using Blazor Single Page Application (webassembly).
-
-More details [here](https://github.com/FBoucher/TinyBlazorAdmin).
-
-
-
-### 4- [PowerAutomate Flow](PowerAutomateFlow/README.md)
-Very simple PowerAutomate Flows (premium license required) to call the Azure Functions
-More details [here](PowerAutomateFlow/README.md).
-
-
-### 5- [M365 SharePoint List](SharePointList/README.md)
-A simple SharePoint list as Admin UI to create and manage AzureShortener Urls. PowerAutomate Flows call the AzureFunction URLs to create, edit or delete (archive) the AzUrlShortener Urls.
-
-More details [here](SharePointList/README.md).
-
-
-### 6- [PowerShell](PowerShell/README.md)
-
-Simple use of the API in PowerShell calling the Azure Functions.
-
-
-
-More details [here](PowerShell/README.md).
-
----
-
-## How to add a new frontend
-
-You don't find the frontend you would like? You can create one in your favorite language and add it to the list!
-
-To do that simply create a pull request for your new frontend. Here some guidance on the format so everybody have the best experience possible.
-
-### Things to include in you Pull Request
-
-1- Add a section to **[List of available Admin frontends](#list-of-available-admin-frontends)**. Make sure you add a short description, language used and a screen shot of your frontend.
-
-2- Create a new folder in the adminTools subfolder with the following structure.
-
-```
-├──adminTools
- └───newFrontend
- ├───medias
- | └───images, screenshots
- ├───src
- | └───the code
- └───README.md
-```
-
-Make sure your readme contains:
-- Detailed deployment steps, and how to configure it.
-- Utilization steps/ guide
-- Use screenshot when possible
-
-
-## Question, problem?
-
-If you have question or encounter any problem using any admin frontend with AzShortenerUrl please feel free to ask help in the [issues section](https://github.com/FBoucher/AzUrlShortener/issues).
\ No newline at end of file
diff --git a/src/adminTools/SharePointList/README.md b/src/adminTools/SharePointList/README.md
deleted file mode 100644
index 78694d64..00000000
--- a/src/adminTools/SharePointList/README.md
+++ /dev/null
@@ -1,133 +0,0 @@
-# M365 SharePoint List as Admin UI
-> **Note**: Some SharePoint knowledge is required! At least you should know whats a site and a list.
-> The PowerAutomate Flows require a premium license (e.g. a per user license) to use the premium connectors.
-
-## Deployment
-
-To deploy YOUR version of **Azure Url Shortener** to Azure and make sure you deploy the Azure Url Shortener __without__ a frontend.
-You just need to click on the "Deploy to Azure" button.
-
-[](https://portal.azure.com/?WT.mc_id=urlshortener-github-frbouche#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FFBoucher%2FAzUrlShortener%2Fmaster%2Fdeployment%2FazureDeploy.json)
-
-> **Note**: make sure you deploy the Azure Url Shortener __without__ a frontend.
-
-
-
----
-
-
-## How to use it
-
-### What you need on SharePoint side
-First you should have some knowledge about what's a SharePoint site (SiteCollection) and a list is. You also need to have permission to create a site or at least permission to create a list in an existing site.
-
-Required things:
-- Create a SharePoint site, or use an existing one (can be done via the linked Flows here as well to make things easier)
-- Create a UrlShortener list (can be done via the provided Flow)
- - add columns to list
-- Flows to call Azure Functions
-
-
-Goto https://office.com, login with your M365 account and open a SharePoint site you have permission to create a list or open directly the URL to an existing SharePoint site (e.g. https://yourtenant.sharepoint.com/sites/UrlShortener)
-
-
-**Manual way - create list manually**
-On a modern page, create a list via **New => List**
-
-
-or go to **Site contents**: https://yourtenant.sharepoint.com/sites/UrlShortener/_layouts/15/viewlsts.aspx?view=14 and create it from there via **New => List**
-Give the list a name.
-
-Our new list is created and contains already a first "Title" column. You can create/add the following required columns (in this order, type and values):
-| Column Name | Column Type | Comments |
-| ------------- | ------------- | ------------- |
-| Url | Hyperlink or Picture | set is as required |
-| Vanity | Single line of text | |
-| ShortUrl | Hyperlink or Picture | |
-| IsArchived | Choice | add choices: true, and false as default value |
-| Archive | Choice | add choice YES as only value, define no default value, set the "Display choices using" to Radio Buttons (=> This is a "help" column to trigger the flow to delete/archive the ShortUrl) |
-
-
-
-
-
-**Automated way - via Flow (recommended way)**
-You can import a flow, which creates a site (SharePoint SiteCollection) and the list with the required columns automatically for you.
-
-Goto: https://flow.microsoft.com
-Then import the Flow: [Download and import Flow](deployment/AzUrlShortener-ProvisionSharePointsitewithlistorlistonly_20200726183707.zip)
-
-
-Select the new imported Flow, enable (Turn on) and then run it:
-
-
-
-During the first run you need to create a new connection to SharePoint.
-
-The values to create a new Site and/or should be more or less self explaining. Normal case is to create a new Site, so we have a few mandatory fields which need to be filled-out even if you only want to create a list.
-
-| | |
-| ------------- | ------------- |
-| Site name: | You can define a name for the new site (if no name is provided a site with the name "UrlShortener" will be created) |
-| Site owner: | add yourself as owner (independent if you create a site or not, if no site is added this value won't be used) |
-| Tenant URL: | https://xxx.sharepoint.com (provide your tenant URL, this URL is used when a new site is created) |
-| Site provisioning: | select here if you want to create a site with the list or the list only |
-| Site URL to create list in: | in case you only want to create the list add here the URL to the already existing site. Add it in the form https://xxx.sharepoint.com/sites/NameOfYourExistingSite |
-
-
-
-
-**Flow - Create new ShortURL**
-Yupee - you provisioned a site and a list called UrlShortener.
-So you now need to import the Flows which connect to this list. After that whenever a new item is created or modified the Flow runs and creates, updates or archives a ShortUrl.
-
-Import now the Flow as you did it before to create a new ShortUrl:
-Import the Flow: [Download and import CreateNewShortURL Flow](deployment/AzUrlShortener-CreatenewShortURL_20200726193851.zip)
-During the import you need to create a new connection to SharePoint with a useraccount who has permission to the UrlShortener site.
-When the Flow is imported, open it for editing and update the Site Address so it's linked to your tenant and UrlShortener site and list.
-
-
-> REMARK: the "When an item is created or modified" has a value set in the settings for Trigger Conditions: `@empty(triggerBody()?['ShortUrl'])`
-The Flow only gets triggered, when the column value of the column "ShortUrl" is empty (for new or modified item action). Just in case the UrlShortener list has been created manually and a different column name has been chosen, adapt the trigger conditions or the Flow will never run.
-
-
-Next, still editing the Flow open the Scope and Parse JSON action. Here the URL to the Azure Function to create a Url needs to be added. Define the full URL, including the code here.
-
-
-Save the Flow (check if you need to activate it) and now you can already test it by adding a new item to the SharePoint list. The Flow should be triggered and the list will be updated with the new created ShortURL.
-
-
-**Flow - Update or Archive ShortURL**
-Import the Flow as you did it before:
-Import the Flow: [Download and import UpdateOrArchiveShortURL Flow](deployment/AzUrlShortener-UpdateorArchiveShortURLValues_20200726200049.zip)
-
-When the Flow is imported, open it for editing and update the Site Address so it's linked to your tenant and UrlShortener site.
-
-
-> REMARK: the "When an item is created or modified" has a value set in the settings for Trigger Conditions: `@or(not(empty(triggerBody()?['ShortUrl'])), not(empty(triggerBody()?['Archive'])))`
-The Flow only gets triggered, when the column value of the column "ShortUrl" is NOT empty or the value to "Archive" a URL is NOT empty. This is a little bit of a hack but works.
-
-Also here, open the Scope and Parse JSON action and add the URLs to both Azure Functions (Update and Archive). Define the full URL, including the code.
-
-
-Save the flow and ensure it's activated and everything is done.
-
----
-
-## What's next? What's planned?
-- [ ] Use Logic Apps instead of PowerAutomate Flow
-- [ ] Secure Azure Function URLs via and read them from Key Vault
-- [ ] \(Optional) Replace Azure Functions with Logic Apps
-- [ ] Further ideas?
-
-
----
-
-## Question, problem?
-
-If you have question or encounter any problem using this admin Frontend with AzShortenerUrl please feel free to ask help in the [issues section](https://github.com/FBoucher/AzUrlShortener/issues).
-
-
-[adminBlazorWebsite_Url_list]: medias/adminBlazorWebsite_Url_list.png
-[adminBlazorWebsite_Add_Url]: medias/adminBlazorWebsite_Add_Url.png
-[portalConfig]: medias/portalConfig.png
diff --git a/src/adminTools/SharePointList/deployment/AzUrlShortener-CreatenewShortURL_20200726193851.zip b/src/adminTools/SharePointList/deployment/AzUrlShortener-CreatenewShortURL_20200726193851.zip
deleted file mode 100644
index b9ab854a..00000000
Binary files a/src/adminTools/SharePointList/deployment/AzUrlShortener-CreatenewShortURL_20200726193851.zip and /dev/null differ
diff --git a/src/adminTools/SharePointList/deployment/AzUrlShortener-ProvisionSharePointsitewithlistorlistonly_20200726183707.zip b/src/adminTools/SharePointList/deployment/AzUrlShortener-ProvisionSharePointsitewithlistorlistonly_20200726183707.zip
deleted file mode 100644
index cc499984..00000000
Binary files a/src/adminTools/SharePointList/deployment/AzUrlShortener-ProvisionSharePointsitewithlistorlistonly_20200726183707.zip and /dev/null differ
diff --git a/src/adminTools/SharePointList/deployment/AzUrlShortener-UpdateorArchiveShortURLValues_20200726200049.zip b/src/adminTools/SharePointList/deployment/AzUrlShortener-UpdateorArchiveShortURLValues_20200726200049.zip
deleted file mode 100644
index 76426bb8..00000000
Binary files a/src/adminTools/SharePointList/deployment/AzUrlShortener-UpdateorArchiveShortURLValues_20200726200049.zip and /dev/null differ
diff --git a/src/adminTools/SharePointList/deployment/Flow_JSON_to_Create_UrlShortner_SP_list.json b/src/adminTools/SharePointList/deployment/Flow_JSON_to_Create_UrlShortner_SP_list.json
deleted file mode 100644
index 9841176c..00000000
--- a/src/adminTools/SharePointList/deployment/Flow_JSON_to_Create_UrlShortner_SP_list.json
+++ /dev/null
@@ -1,46 +0,0 @@
-{
- "verb": "createSPList",
- "listName": "UrlShortener",
- "templateType": 100,
- "subactions": [
- {
- "verb": "setTitle",
- "title": "UrlShortener"
- },
- {
- "verb": "setDescription",
- "description": "UrlShortener admin list (UI) to create short url processed by AzUrlShortener"
- },
- {
- "verb": "addSPFieldXml",
- "addToDefaultView": true,
- "description": "Long original URL",
- "schemaXml": ""
- },
- {
- "verb": "addSPField",
- "fieldType": "Text",
- "displayName": "Vanity",
- "internalName": "Vanity",
- "description": "Vanity or own text as short url",
- "addToDefaultView": true,
- "id": "c532fcb9-cdb3-45c6-8247-c784dcd58e1b",
- "isRequired": false
- },
- {
- "verb": "addSPFieldXml",
- "addToDefaultView": true,
- "schemaXml": ""
- },
- {
- "verb": "addSPFieldXml",
- "addToDefaultView": true,
- "schemaXml": "falsefalsetrue"
- },
- {
- "verb": "addSPFieldXml",
- "addToDefaultView": true,
- "schemaXml": "Yes"
- }
- ]
-}
\ No newline at end of file
diff --git a/src/adminTools/SharePointList/medias/CreateNewList.jpg b/src/adminTools/SharePointList/medias/CreateNewList.jpg
deleted file mode 100644
index 39a57f67..00000000
Binary files a/src/adminTools/SharePointList/medias/CreateNewList.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Create_ListColumns.jpg b/src/adminTools/SharePointList/medias/Create_ListColumns.jpg
deleted file mode 100644
index f0f68eee..00000000
Binary files a/src/adminTools/SharePointList/medias/Create_ListColumns.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Deploy_AzureUrlShortener_without_Frontend.jpg b/src/adminTools/SharePointList/medias/Deploy_AzureUrlShortener_without_Frontend.jpg
deleted file mode 100644
index bd855708..00000000
Binary files a/src/adminTools/SharePointList/medias/Deploy_AzureUrlShortener_without_Frontend.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/EnableFlow.jpg b/src/adminTools/SharePointList/medias/EnableFlow.jpg
deleted file mode 100644
index e4bcf73e..00000000
Binary files a/src/adminTools/SharePointList/medias/EnableFlow.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl.jpg b/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl.jpg
deleted file mode 100644
index 3503ed9f..00000000
Binary files a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_AzureFunctionUrl.jpg b/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_AzureFunctionUrl.jpg
deleted file mode 100644
index 40c9256a..00000000
Binary files a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_AzureFunctionUrl.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_TriggerConditions.jpg b/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_TriggerConditions.jpg
deleted file mode 100644
index f385530a..00000000
Binary files a/src/adminTools/SharePointList/medias/Flow_CreateNewShortUrl_TriggerConditions.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Flow_UpdateOrArchive_AzureFunctionUrl.jpg b/src/adminTools/SharePointList/medias/Flow_UpdateOrArchive_AzureFunctionUrl.jpg
deleted file mode 100644
index bc0d5af9..00000000
Binary files a/src/adminTools/SharePointList/medias/Flow_UpdateOrArchive_AzureFunctionUrl.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Import_PowerAutomate_Flow.jpg b/src/adminTools/SharePointList/medias/Import_PowerAutomate_Flow.jpg
deleted file mode 100644
index dc8b34b5..00000000
Binary files a/src/adminTools/SharePointList/medias/Import_PowerAutomate_Flow.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/RunFlow_to_create_site_and_or_list.jpg b/src/adminTools/SharePointList/medias/RunFlow_to_create_site_and_or_list.jpg
deleted file mode 100644
index 8d6c1255..00000000
Binary files a/src/adminTools/SharePointList/medias/RunFlow_to_create_site_and_or_list.jpg and /dev/null differ
diff --git a/src/adminTools/SharePointList/medias/Run_flow_site_provisioning.jpg b/src/adminTools/SharePointList/medias/Run_flow_site_provisioning.jpg
deleted file mode 100644
index 60d86747..00000000
Binary files a/src/adminTools/SharePointList/medias/Run_flow_site_provisioning.jpg and /dev/null differ
diff --git a/src/adminTools/adminBlazorWebsite/README.md b/src/adminTools/adminBlazorWebsite/README.md
deleted file mode 100644
index b4963810..00000000
--- a/src/adminTools/adminBlazorWebsite/README.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Admin Blazor Website Frontend
-
-## Deployment
-
-To deploy YOUR version of **Azure Url Shortener Admin Blazor WebSite** to Azure, you just need to click on the "Deploy to Azure" button.
-
-[](https://portal.azure.com/?WT.mc_id=urlshortener-github-frbouche#create/Microsoft.Template/uri/https%3A%2F%2Fraw.githubusercontent.com%2FFBoucher%2FAzUrlShortener%2Fmain%2Fsrc%2FadminTools%2FadminBlazorWebsite%2Fdeployment%2FadminBlazorWebsite-deployAzure.json)
-
-> **Note**: this is now done automatically during the Azure deployment.
->
-> Once it's deployed, you will need to add the URLs of the Azure Function in the configuration of the website. You can use this page to know [How to get the Azure Function URLs](https://github.com/FBoucher/AzUrlShortener/blob/main/doc/post-deployment-configuration.md#how-to-get-the-azure-function-urls).
->
-> To update the website configuration, go to the Azure Portal [portal.azure.com](portal.azure.com). Find the website you just deployed, and click on it. From the left menu, select *Configuration*. Update the value of the config named: `AzureFunctionUrlListUrl` and `AzureFunctionUrlShortenerUrl`.
->
-> Don't forget to click the **Save** button! This will prompt you to confirm because it will restart the App service. Click Ok.
-
-> ![Update App Service Config][portalConfig]
-
-### Alternative deployment
-
-You can host the website locally or in any regular webserver. You will need to Build, and Publish yourself.
-
-To test it a simple F5 in VSCode or Visual Studio should work.
-
-
----
-
-
-## How to use it
-
-### Create a short Url
-
-Once you are in the website, first go into the **Manage Urls** section by clicking the option in the left menu. Than click the **Add New Url** button.
-
-The *Vanity* is the end of the URL and is optional.
-
-![How To Add a Url][adminBlazorWebsite_Add_Url]
-
-
-### List all Urls
-
-Once you are in the website, just click on the **Manage Urls** on the left menu.
-
-![See Url list][adminBlazorWebsite_Url_list]
-
-
----
-
-
-## Question, problem?
-
-If you have question or encounter any problem using this admin Frontend with AzShortenerUrl please feel free to ask help in the [issues section](https://github.com/FBoucher/AzUrlShortener/issues).
-
-
-[adminBlazorWebsite_Url_list]: medias/adminBlazorWebsite_Url_list.png
-[adminBlazorWebsite_Add_Url]: medias/adminBlazorWebsite_Add_Url.png
-[portalConfig]: medias/portalConfig.png
diff --git a/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json b/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json
deleted file mode 100644
index 29f00f94..00000000
--- a/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.json
+++ /dev/null
@@ -1,176 +0,0 @@
-{
- "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
- "contentVersion": "1.0.0.0",
- "parameters": {
- "baseName": {
- "defaultValue": "ShortenerTools",
- "type": "string",
- "metadata": {
- "description": "Name use as base-template to named the resources to be deployed in Azure."
- }
- },
- "AdminEMail": {
- "type": "string",
- "metadata": {
- "description": "Email use to create the administrator of the Website"
- }
- },
- "AdminPassword": {
- "type": "securestring",
- "metadata": {
- "description": "Strong Password use to create the Administrator account. It MOST have: an uppercase character ,a lowercase character, a digit, a non-alphanumeric character, must be at least six (6) characters long."
- }
- },
- "AzureFunctionUrl": {
- "type": "string",
- "metadata": {
- "description": "URL of the Azure Function (ex: https://....azurewebsites.net)"
- }
- },
- "SecurityCode": {
- "type": "string",
- "metadata": {
- "description": "Security token for the Azure Function."
- }
- },
- "GitHubURL": {
- "type": "string",
- "defaultValue": "https://github.com/fboucher/AzUrlShortener.git",
- "metadata": {
- "description": "The URL of GitHub (ending by .git)"
- }
- },
- "GitHubBranch": {
- "type": "string",
- "defaultValue": "main",
- "metadata": {
- "description": "Name of the branch to use when deploying (Default = main)."
- }
- },
- "ExpireOn":{
- "type":"string",
- "defaultValue":"[utcNow('yyyy-MM-dd')]",
- "metadata": {
- "description": "Just a text value (format: yyyy-MM-dd) that express when it is safe to delete these resources"
- }
- },
- "OwnerName":{
- "type":"string",
- "defaultValue":"",
- "metadata": {
- "description": "Owner of this deployment, person to contact for question."
- }
- }
- },
- "variables": {
- "suffix": "[substring(toLower(uniqueString(resourceGroup().id, resourceGroup().location)),0,5)]",
- "webAppName": "[toLower(concat(parameters('baseName'), variables('suffix')))]",
- "webAppStorageAccountName": "[tolower(concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),16)), variables('suffix'), 'stg'))]",
- "webAppHhostingPlanName": "[concat(substring(parameters('baseName'), 0, min(length(parameters('baseName')),14)), variables('suffix'), 'plan')]",
- "functionProjectFolder": "src/adminTools/adminBlazorWebsite/src/adminBlazorWebsite.csproj"
- },
- "resources": [
- {
- "name": "[variables('webAppName')]",
- "type": "Microsoft.Web/sites",
- "apiVersion": "2018-11-01",
- "location": "[resourceGroup().location]",
- "tags": {
- "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', variables('webAppHhostingPlanName'))]": "Resource",
- "displayName": "[variables('webAppName')]"
- },
- "dependsOn": [
- "[resourceId('Microsoft.Web/serverfarms', variables('webAppHhostingPlanName'))]"
- ],
- "properties": {
- "name": "[variables('webAppName')]",
- "siteConfig": {
- "appSettings": [
- {
- "name": "azFunctionUrl",
- "value": "[parameters('AzureFunctionUrl')]"
- },
- {
- "name": "code",
- "value": "[parameters('SecurityCode')]"
- },
- {
- "name": "PROJECT",
- "value": "[variables('functionProjectFolder')]"
- },
- {
- "name": "defaultAdminEMail",
- "value": "[parameters('AdminEMail')]"
- },
- {
- "name": "defaultAdminPW",
- "value": "[parameters('AdminPassword')]"
- }
- ],
- "metadata":[
- {
- "name": "CURRENT_STACK",
- "value": "dotnetcore"
- }
- ],
- "phpVersion": "OFF",
- "alwaysOn": true
- },
- "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('webAppHhostingPlanName'))]",
- "hostingEnvironment": "",
- "clientAffinityEnabled": true
- },
- "resources": [
- {
- "apiVersion": "2018-11-01",
- "type":"sourcecontrols",
- "name": "web",
- "dependsOn": [
- "[resourceId('Microsoft.Web/sites/', variables('webAppName'))]"
- ],
- "properties": {
- "RepoUrl": "[parameters('GitHubURL')]",
- "branch": "[parameters('GitHubBranch')]",
- "publishRunbook": true,
- "IsManualIntegration": true
- }
- }
- ]
- },
- {
- "name": "[variables('webAppStorageAccountName')]",
- "type": "Microsoft.Storage/storageAccounts",
- "apiVersion": "2015-06-15",
- "location": "[resourceGroup().location]",
- "tags": {
- "displayName": "[variables('webAppStorageAccountName')]"
- },
- "properties": {
- "accountType": "Standard_LRS"
- }
- },
- {
- "name": "[variables('webAppHhostingPlanName')]",
- "type": "Microsoft.Web/serverfarms",
- "apiVersion": "2018-11-01",
- "kind": "",
- "location": "[resourceGroup().location]",
- "sku": {
- "Tier": "Basic",
- "Name": "B1"
- },
- "tags": {
- "displayName": "[variables('webAppHhostingPlanName')]"
- },
- "properties": {
- "name": "[variables('webAppHhostingPlanName')]",
- "workerSize": "0",
- "workerSizeId": "0",
- "numberOfWorkers": "1",
- "hostingEnvironment": ""
- }
- }
- ],
- "outputs": {},
- "functions": []
-}
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.params.json b/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.params.json
deleted file mode 100644
index 21e86726..00000000
--- a/src/adminTools/adminBlazorWebsite/deployment/adminBlazorWebsite-deployAzure.params.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
- "contentVersion": "1.0.0.0",
- "parameters": {
- "baseName": {
- "value": "AzUrlShortenerAdmin"
- },
- "AdminEMail": {
- "value": "admin@cloud5mins.com"
- },
- "AdminPassword": {
- "value": "Supernewt42!"
- },
- "AzureFunctionUrl": {
- "value": "http//"
- },
- "SecurityCode": {
- "value": ""
- },
- "OwnerName": {
- "value": "Frank"
- },
- "GitHubBranch": {
- "value": "main"
- }
- }
-}
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/deployment/debug.azcli b/src/adminTools/adminBlazorWebsite/deployment/debug.azcli
deleted file mode 100644
index 04d9cccf..00000000
--- a/src/adminTools/adminBlazorWebsite/deployment/debug.azcli
+++ /dev/null
@@ -1,15 +0,0 @@
-
-# az login
-
-# az accound set -s ######-#####-#####-######
-
-
-
-az group create -n AdminUrlShortener -l eastus
-
-# validate with Parameter file
-az group deployment validate -g AdminUrlShortener --template-file "deployment/adminBlazorWebsite-deployAzure.json" --parameters "deployment/adminBlazorWebsite-deployAzure.params.json" --verbose
-
-# deploy it
-az group deployment create -g AdminUrlShortener -n cloud5minsv2 --template-file "deployment/adminBlazorWebsite-deployAzure.json" --parameters "deployment/adminBlazorWebsite-deployAzure.params.json" --verbose
-
diff --git a/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Add_Url.png b/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Add_Url.png
deleted file mode 100644
index 51674f3b..00000000
Binary files a/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Add_Url.png and /dev/null differ
diff --git a/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Url_list.png b/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Url_list.png
deleted file mode 100644
index cda911e4..00000000
Binary files a/src/adminTools/adminBlazorWebsite/medias/adminBlazorWebsite_Url_list.png and /dev/null differ
diff --git a/src/adminTools/adminBlazorWebsite/medias/portalConfig.png b/src/adminTools/adminBlazorWebsite/medias/portalConfig.png
deleted file mode 100644
index 0a920b62..00000000
Binary files a/src/adminTools/adminBlazorWebsite/medias/portalConfig.png and /dev/null differ
diff --git a/src/adminTools/adminBlazorWebsite/src/.vscode/launch.json b/src/adminTools/adminBlazorWebsite/src/.vscode/launch.json
deleted file mode 100644
index edec072a..00000000
--- a/src/adminTools/adminBlazorWebsite/src/.vscode/launch.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- // Use IntelliSense to find out which attributes exist for C# debugging
- // Use hover for the description of the existing attributes
- // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
- "version": "0.2.0",
- "configurations": [
- {
- "name": ".NET Core Launch (web)",
- "type": "coreclr",
- "request": "launch",
- "preLaunchTask": "build",
- // If you have changed target frameworks, make sure to update the program path.
- "program": "${workspaceFolder}/bin/Debug/netcoreapp3.1/adminBlazorWebsite.dll",
- "args": [],
- "cwd": "${workspaceFolder}",
- "stopAtEntry": false,
- // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
- "serverReadyAction": {
- "action": "openExternally",
- "pattern": "^\\s*Now listening on:\\s+(https?://\\S+)"
- },
- "env": {
- "ASPNETCORE_ENVIRONMENT": "Development"
- },
- "sourceFileMap": {
- "/Views": "${workspaceFolder}/Views"
- }
- },
- {
- "name": ".NET Core Attach",
- "type": "coreclr",
- "request": "attach",
- "processId": "${command:pickProcess}"
- }
- ]
-}
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/src/Abstractions/IUrlShortenerService.cs b/src/adminTools/adminBlazorWebsite/src/Abstractions/IUrlShortenerService.cs
new file mode 100644
index 00000000..711bab67
--- /dev/null
+++ b/src/adminTools/adminBlazorWebsite/src/Abstractions/IUrlShortenerService.cs
@@ -0,0 +1,12 @@
+using adminBlazorWebsite.Data;
+using System.Threading.Tasks;
+
+namespace adminBlazorWebsite.Abstractions
+{
+ public interface IUrlShortenerService
+ {
+ Task CreateShortUrl(ShortUrlRequest shortUrlRequest);
+ Task UpdateShortUrl(ShortUrlEntity editedUrl);
+ Task ArchiveShortUrl(ShortUrlEntity archivedUrl);
+ }
+}
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/IdentityHostingStartup.cs b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/IdentityHostingStartup.cs
index ad721a2e..0f2e84a3 100644
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/IdentityHostingStartup.cs
+++ b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/IdentityHostingStartup.cs
@@ -1,11 +1,4 @@
-using System;
-using adminBlazorWebsite.Data;
using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.UI;
-using Microsoft.EntityFrameworkCore;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
[assembly: HostingStartup(typeof(adminBlazorWebsite.Areas.Identity.IdentityHostingStartup))]
namespace adminBlazorWebsite.Areas.Identity
@@ -14,7 +7,8 @@ public class IdentityHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
- builder.ConfigureServices((context, services) => {
+ builder.ConfigureServices((context, services) =>
+ {
});
}
}
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/LogOut.cshtml b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/LogOut.cshtml
deleted file mode 100644
index cb864ef2..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/LogOut.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@page
-@model LogoutModel
-@{
- ViewData["Title"] = "Log out";
-}
-
-
-
@ViewData["Title"]
-
You have successfully logged out of the application.
-
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml
deleted file mode 100644
index 0bcdba58..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml
+++ /dev/null
@@ -1,74 +0,0 @@
-@page
-@model LoginModel
-
-@{
- ViewData["Title"] = "Log in";
-}
-
-
- There are no external authentication services configured. See this article
- for details on setting up this ASP.NET application to support logging in via external services.
-
-
- }
- else
- {
-
- }
- }
-
-
-
-
-@section Scripts {
-
-}
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml.cs b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml.cs
index 94a0c29a..6c326fbb 100644
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml.cs
+++ b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Login.cshtml.cs
@@ -1,16 +1,13 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Linq;
-using System.Text.Encodings.Web;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
-using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Linq;
+using System.Threading.Tasks;
namespace adminBlazorWebsite.Areas.Identity.Pages.Account
{
@@ -21,7 +18,7 @@ public class LoginModel : PageModel
private readonly SignInManager _signInManager;
private readonly ILogger _logger;
- public LoginModel(SignInManager signInManager,
+ public LoginModel(SignInManager signInManager,
ILogger logger,
UserManager userManager)
{
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Logout.cshtml.cs b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Logout.cshtml.cs
index 804bc591..3bf51673 100644
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Logout.cshtml.cs
+++ b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/Logout.cshtml.cs
@@ -1,12 +1,9 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
+using System.Threading.Tasks;
namespace adminBlazorWebsite.Areas.Identity.Pages.Account
{
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/_ViewImports.cshtml b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/_ViewImports.cshtml
deleted file mode 100644
index 6ab26a15..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Account/_ViewImports.cshtml
+++ /dev/null
@@ -1 +0,0 @@
-@using adminBlazorWebsite.Areas.Identity.Pages.Account
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Shared/_LoginPartial.cshtml b/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Shared/_LoginPartial.cshtml
deleted file mode 100644
index 3b627e98..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Areas/Identity/Pages/Shared/_LoginPartial.cshtml
+++ /dev/null
@@ -1,24 +0,0 @@
-@using Microsoft.AspNetCore.Identity
-@inject SignInManager SignInManager
-@inject UserManager UserManager
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
-
-
- Swapping to Development environment will display more detailed information about the error that occurred.
-
-
- The Development environment shouldn't be enabled for deployed applications.
- It can result in displaying sensitive information from exceptions to end users.
- For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development
- and restarting the app.
-
\ No newline at end of file
diff --git a/src/adminTools/adminBlazorWebsite/src/Pages/Index.razor b/src/adminTools/adminBlazorWebsite/src/Pages/Index.razor
deleted file mode 100644
index 5c410eb3..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Pages/Index.razor
+++ /dev/null
@@ -1,12 +0,0 @@
-@page "/"
-
-
Hello, Cloudies!
-
-This is a simple admin interface to manage the short URLs generated by the Azure Url Shortener.
-
-
-It's a budget-friendly solution that YOU can have.
-
-
- An error has occurred. This application may no longer respond until reloaded.
-
-
- An unhandled exception has occurred. See browser dev tools for details.
-
- Reload
- 🗙
-
-
-
-
-
diff --git a/src/adminTools/adminBlazorWebsite/src/Pages/_ViewImports.cshtml b/src/adminTools/adminBlazorWebsite/src/Pages/_ViewImports.cshtml
deleted file mode 100644
index c140cee0..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Pages/_ViewImports.cshtml
+++ /dev/null
@@ -1,6 +0,0 @@
-@using Microsoft.AspNetCore.Identity
-@using adminBlazorWebsite.Areas.Identity
-
-
-adminBlazorWebsite.Pages
-@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
diff --git a/src/adminTools/adminBlazorWebsite/src/Pages/_ViewStart.cshtml b/src/adminTools/adminBlazorWebsite/src/Pages/_ViewStart.cshtml
deleted file mode 100644
index 820a2f6e..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Pages/_ViewStart.cshtml
+++ /dev/null
@@ -1,3 +0,0 @@
-@{
- Layout = "_Layout";
-}
diff --git a/src/adminTools/adminBlazorWebsite/src/Program.cs b/src/adminTools/adminBlazorWebsite/src/Program.cs
index a398e311..a1f04c3f 100644
--- a/src/adminTools/adminBlazorWebsite/src/Program.cs
+++ b/src/adminTools/adminBlazorWebsite/src/Program.cs
@@ -1,4 +1,3 @@
-using System;
using adminBlazorWebsite.Data;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
@@ -6,6 +5,7 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
+using System;
namespace adminBlazorWebsite
{
@@ -14,33 +14,33 @@ public class Program
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
-
- using (var scope = host.Services.CreateScope())
- {
- var services = scope.ServiceProvider;
- try
+ using (var scope = host.Services.CreateScope())
{
- var context = services.GetRequiredService();
- context.Database.Migrate();
+ var services = scope.ServiceProvider;
+
+ try
+ {
+ var context = services.GetRequiredService();
+ context.Database.Migrate();
- // requires using Microsoft.Extensions.Configuration;
- var config = host.Services.GetRequiredService();
- // Set password with the Secret Manager tool.
- // dotnet user-secrets set SeedUserPW
+ // requires using Microsoft.Extensions.Configuration;
+ var config = host.Services.GetRequiredService();
+ // Set password with the Secret Manager tool.
+ // dotnet user-secrets set SeedUserPW
- var defaultAdminEMail = config["defaultAdminEMail"];
- var defaultAdminPW = config["defaultAdminPW"];
+ var defaultAdminEMail = config["defaultAdminEMail"];
+ var defaultAdminPW = config["defaultAdminPW"];
- SeedData.Initialize(services, defaultAdminEMail, defaultAdminPW).Wait();
- }
- catch (Exception ex)
- {
- var logger = services.GetRequiredService>();
- logger.LogError(ex, "An error occurred seeding the DB.");
+ SeedData.Initialize(services, defaultAdminEMail, defaultAdminPW).Wait();
+ }
+ catch (Exception ex)
+ {
+ var logger = services.GetRequiredService>();
+ logger.LogError(ex, "An error occurred seeding the DB.");
+ }
}
- }
-
+
host.Run();
}
diff --git a/src/adminTools/adminBlazorWebsite/src/Shared/LoginDisplay.razor b/src/adminTools/adminBlazorWebsite/src/Shared/LoginDisplay.razor
deleted file mode 100644
index 854ffabe..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Shared/LoginDisplay.razor
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- Hello, @context.User.Identity.Name!
-
-
-
- Log in
-
-
diff --git a/src/adminTools/adminBlazorWebsite/src/Shared/MainLayout.razor b/src/adminTools/adminBlazorWebsite/src/Shared/MainLayout.razor
deleted file mode 100644
index fafa2f55..00000000
--- a/src/adminTools/adminBlazorWebsite/src/Shared/MainLayout.razor
+++ /dev/null
@@ -1,16 +0,0 @@
-@inherits LayoutComponentBase
-
-