├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── challenge-solution-submission.md │ └── feature_request.md ├── BackStory.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── assets ├── 2007_Snow-Hill-Island_Luyten-De-Hauwere-Emperor-Penguin-56.jpg ├── COLDSTART-INSIDE-FACTORY2-500x275.png ├── COLDSTART-STAMP-CARD-BOTH-400x267.png ├── COLDSTART-TRUCK-400x300.png └── RaspberryPi.jpg └── challenges ├── challenge1 ├── README.md ├── finished │ └── coldstartapp │ │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ ├── settings.json │ │ └── tasks.json │ │ ├── README.md │ │ ├── api │ │ ├── .funcignore │ │ ├── .gitignore │ │ ├── .vscode │ │ │ ├── extensions.json │ │ │ ├── launch.json │ │ │ ├── settings.json │ │ │ └── tasks.json │ │ ├── catalog-get │ │ │ ├── function.json │ │ │ └── index.js │ │ ├── host.json │ │ ├── orders-post │ │ │ ├── function.json │ │ │ └── index.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── proxies.json │ │ └── shared │ │ │ ├── catalog-data.js │ │ │ ├── catalog.json │ │ │ └── user-utils.js │ │ └── vue-app │ │ ├── .browserslistrc │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .prettierrc │ │ ├── babel.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── public │ │ ├── 404.html │ │ ├── favicon.ico │ │ ├── index.html │ │ └── routes.json │ │ ├── src │ │ ├── app.vue │ │ ├── assets │ │ │ ├── COLDSTART-LOGO-black.png │ │ │ ├── COLDSTART-LOGO-white.png │ │ │ ├── js │ │ │ │ └── userInfo.js │ │ │ └── logo.png │ │ ├── components │ │ │ ├── auth-login.vue │ │ │ ├── auth-logout.vue │ │ │ ├── button-footer.vue │ │ │ ├── card-content.vue │ │ │ ├── header-bar-brand.vue │ │ │ ├── header-bar.vue │ │ │ ├── list-header.vue │ │ │ ├── modal.vue │ │ │ └── page-not-found.vue │ │ ├── main.js │ │ ├── router.js │ │ ├── store │ │ │ ├── config.js │ │ │ ├── index.js │ │ │ └── modules │ │ │ │ ├── action-utils.js │ │ │ │ ├── catalog.js │ │ │ │ ├── icecreams.js │ │ │ │ └── mutation-types.js │ │ ├── styles.scss │ │ └── views │ │ │ └── catalog │ │ │ ├── catalog-list.vue │ │ │ └── catalog.vue │ │ └── vue.config.js └── starter │ └── coldstartapp │ ├── README.md │ ├── api │ ├── .funcignore │ ├── .gitignore │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ ├── settings.json │ │ └── tasks.json │ ├── catalog-get │ │ ├── function.json │ │ └── index.js │ ├── host.json │ ├── local.setting.json │ ├── orders-post │ │ ├── function.json │ │ └── index.js │ ├── package-lock.json │ ├── package.json │ ├── proxies.json │ └── shared │ │ ├── catalog-data.js │ │ ├── catalog.json │ │ ├── config.js │ │ └── user-utils.js │ └── vue-app │ ├── .browserslistrc │ ├── .eslintrc.js │ ├── .gitignore │ ├── .prettierrc │ ├── babel.config.js │ ├── package-lock.json │ ├── package.json │ ├── postcss.config.js │ ├── public │ ├── 404.html │ ├── favicon.ico │ ├── index.html │ └── routes.json │ ├── src │ ├── app.vue │ ├── assets │ │ ├── COLDSTART-LOGO-black.png │ │ ├── COLDSTART-LOGO-white.png │ │ ├── js │ │ │ └── userInfo.js │ │ └── logo.png │ ├── components │ │ ├── auth-login.vue │ │ ├── auth-logout.vue │ │ ├── button-footer.vue │ │ ├── card-content.vue │ │ ├── header-bar-brand.vue │ │ ├── header-bar.vue │ │ ├── list-header.vue │ │ └── page-not-found.vue │ ├── main.js │ ├── router.js │ ├── store │ │ ├── config.js │ │ ├── index.js │ │ └── modules │ │ │ ├── action-utils.js │ │ │ ├── catalog.js │ │ │ └── mutation-types.js │ ├── styles.scss │ └── views │ │ └── catalog │ │ ├── catalog-list.vue │ │ └── catalog.vue │ └── vue.config.js ├── challenge2 ├── README.md ├── finished │ ├── Data Factory │ │ └── arm_template.zip │ └── coldstartapp │ │ ├── .vscode │ │ ├── extensions.json │ │ ├── launch.json │ │ ├── settings.json │ │ └── tasks.json │ │ ├── README.md │ │ ├── api │ │ ├── .funcignore │ │ ├── .gitignore │ │ ├── .vscode │ │ │ ├── extensions.json │ │ │ ├── launch.json │ │ │ ├── settings.json │ │ │ └── tasks.json │ │ ├── catalog-get │ │ │ ├── function.json │ │ │ └── index.js │ │ ├── host.json │ │ ├── local.setting.json │ │ ├── orders-post │ │ │ ├── function.json │ │ │ └── index.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── proxies.json │ │ ├── recommendations-get │ │ │ ├── function.json │ │ │ └── index.js │ │ ├── recommendations-post │ │ │ ├── function.json │ │ │ └── index.js │ │ └── shared │ │ │ ├── catalog-data.js │ │ │ ├── catalog.json │ │ │ ├── config.js │ │ │ ├── order-data.js │ │ │ ├── recommendation-data.js │ │ │ └── user-utils.js │ │ └── vue-app │ │ ├── .browserslistrc │ │ ├── .eslintrc.js │ │ ├── .gitignore │ │ ├── .prettierrc │ │ ├── babel.config.js │ │ ├── package-lock.json │ │ ├── package.json │ │ ├── postcss.config.js │ │ ├── public │ │ ├── 404.html │ │ ├── favicon.ico │ │ ├── index.html │ │ └── routes.json │ │ ├── src │ │ ├── app.vue │ │ ├── assets │ │ │ ├── COLDSTART-LOGO-black.png │ │ │ ├── COLDSTART-LOGO-white.png │ │ │ ├── js │ │ │ │ └── userInfo.js │ │ │ └── logo.png │ │ ├── components │ │ │ ├── auth-login.vue │ │ │ ├── auth-logout.vue │ │ │ ├── button-footer.vue │ │ │ ├── card-content.vue │ │ │ ├── header-bar-brand.vue │ │ │ ├── header-bar.vue │ │ │ ├── list-header.vue │ │ │ ├── modal.vue │ │ │ └── page-not-found.vue │ │ ├── main.js │ │ ├── router.js │ │ ├── store │ │ │ ├── config.js │ │ │ ├── index.js │ │ │ └── modules │ │ │ │ ├── action-utils.js │ │ │ │ ├── catalog.js │ │ │ │ ├── icecreams.js │ │ │ │ ├── mutation-types.js │ │ │ │ └── recommendations.js │ │ ├── styles.scss │ │ └── views │ │ │ └── catalog │ │ │ ├── catalog-list.vue │ │ │ └── catalog.vue │ │ └── vue.config.js └── starter │ ├── data │ └── coldstart-orders-historical.csv │ └── scripts │ └── sql │ ├── create_table_drivers.sql │ ├── create_table_icecreams.sql │ └── create_table_orders.sql ├── challenge3 ├── README.md └── finished │ └── coldstartapi │ ├── .funcignore │ ├── .gitignore │ ├── .vscode │ ├── extensions.json │ ├── launch.json │ ├── settings.json │ └── tasks.json │ ├── host.json │ ├── orders-queued │ ├── function.json │ └── index.js │ ├── orders-timer │ ├── function.json │ └── index.js │ ├── package-lock.json │ ├── package.json │ ├── proxies.json │ └── shared │ ├── catalog-data.js │ ├── config.js │ ├── cosmosdb-utils.js │ ├── driver-data.js │ ├── order-cosmos-data.js │ ├── sql-utils.js │ └── user-utils.js ├── challenge4 ├── README.md └── starter │ ├── ColdStartCustomerSWA │ ├── .gitignore │ ├── ColdStartCustomer.ComponentsLibrary │ │ ├── ColdStartCustomerSWA.ComponentsLibrary.csproj │ │ ├── LocalStorage.cs │ │ ├── Map │ │ │ ├── Map.razor │ │ │ ├── Marker.cs │ │ │ └── Point.cs │ │ └── wwwroot │ │ │ ├── background.png │ │ │ ├── deliveryMap.js │ │ │ ├── exampleJsInterop.js │ │ │ ├── leaflet │ │ │ ├── images │ │ │ │ ├── layers-2x.png │ │ │ │ ├── layers.png │ │ │ │ ├── marker-icon-2x.png │ │ │ │ ├── marker-icon.png │ │ │ │ └── marker-shadow.png │ │ │ ├── leaflet.css │ │ │ └── leaflet.js │ │ │ ├── localStorage.js │ │ │ └── pushNotifications.js │ ├── ColdStartCustomerSWA.Shared │ │ ├── ColdStartCustomerSWA.Shared.csproj │ │ ├── Driver.cs │ │ ├── IceCream.cs │ │ └── Order.cs │ ├── ColdStartCustomerSWA.sln │ └── ColdStartCustomerSWA │ │ ├── App.razor │ │ ├── ColdStartCustomerSWA.csproj │ │ ├── OrdersClient.cs │ │ ├── Pages │ │ ├── Index.razor │ │ └── LoginProviders.razor │ │ ├── Program.cs │ │ ├── Properties │ │ └── launchSettings.json │ │ ├── Shared │ │ ├── LoginDisplay.razor │ │ ├── MainLayout.razor │ │ └── MainLayout.razor.css │ │ ├── _Imports.razor │ │ └── wwwroot │ │ ├── appsettings.Development.json │ │ ├── appsettings.json │ │ ├── css │ │ ├── app.css │ │ ├── bootstrap │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── font │ │ │ ├── quicksand-v8-latin-300.woff │ │ │ ├── quicksand-v8-latin-300.woff2 │ │ │ ├── quicksand-v8-latin-500.woff │ │ │ ├── quicksand-v8-latin-500.woff2 │ │ │ ├── quicksand-v8-latin-700.woff │ │ │ ├── quicksand-v8-latin-700.woff2 │ │ │ ├── quicksand-v8-latin-regular.woff │ │ │ ├── quicksand-v8-latin-regular.woff2 │ │ │ └── quicksand.css │ │ └── open-iconic │ │ │ ├── FONT-LICENSE │ │ │ ├── ICON-LICENSE │ │ │ ├── README.md │ │ │ └── font │ │ │ ├── css │ │ │ └── open-iconic-bootstrap.min.css │ │ │ └── fonts │ │ │ ├── open-iconic.eot │ │ │ ├── open-iconic.otf │ │ │ ├── open-iconic.svg │ │ │ ├── open-iconic.ttf │ │ │ └── open-iconic.woff │ │ ├── img │ │ ├── logo.png │ │ └── orders.png │ │ ├── index.html │ │ ├── manifest.json │ │ ├── sample-data │ │ └── me.json │ │ ├── service-worker.js │ │ └── service-worker.published.js │ ├── DriverApp │ ├── .gitignore │ ├── ColdStartChallenge.DriverApp.sln │ └── ColdStartChallenge.DriverApp │ │ ├── ColdStartChallenge.DriverApp.Android │ │ ├── Assets │ │ │ └── AboutAssets.txt │ │ ├── ColdStartChallenge.DriverApp.Android.csproj │ │ ├── MainActivity.cs │ │ ├── Properties │ │ │ ├── AndroidManifest.xml │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── AboutResources.txt │ │ │ ├── Resource.designer.cs │ │ │ ├── drawable │ │ │ ├── COLDSTART_LOGO_black.png │ │ │ └── Truck.png │ │ │ ├── layout │ │ │ ├── Tabbar.xml │ │ │ └── Toolbar.xml │ │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher.xml │ │ │ └── ic_launcher_round.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_foreground.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ └── styles.xml │ │ ├── ColdStartChallenge.DriverApp.UWP │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── Assets │ │ │ ├── LargeTile.scale-100.png │ │ │ ├── LargeTile.scale-125.png │ │ │ ├── LargeTile.scale-150.png │ │ │ ├── LargeTile.scale-200.png │ │ │ ├── LargeTile.scale-400.png │ │ │ ├── SmallTile.scale-100.png │ │ │ ├── SmallTile.scale-125.png │ │ │ ├── SmallTile.scale-150.png │ │ │ ├── SmallTile.scale-200.png │ │ │ ├── SmallTile.scale-400.png │ │ │ ├── SplashScreen.scale-100.png │ │ │ ├── SplashScreen.scale-125.png │ │ │ ├── SplashScreen.scale-150.png │ │ │ ├── SplashScreen.scale-200.png │ │ │ ├── SplashScreen.scale-400.png │ │ │ ├── Square150x150Logo.scale-100.png │ │ │ ├── Square150x150Logo.scale-125.png │ │ │ ├── Square150x150Logo.scale-150.png │ │ │ ├── Square150x150Logo.scale-200.png │ │ │ ├── Square150x150Logo.scale-400.png │ │ │ ├── Square44x44Logo.altform-lightunplated_targetsize-16.png │ │ │ ├── Square44x44Logo.altform-lightunplated_targetsize-24.png │ │ │ ├── Square44x44Logo.altform-lightunplated_targetsize-256.png │ │ │ ├── Square44x44Logo.altform-lightunplated_targetsize-32.png │ │ │ ├── Square44x44Logo.altform-lightunplated_targetsize-48.png │ │ │ ├── Square44x44Logo.altform-unplated_targetsize-16.png │ │ │ ├── Square44x44Logo.altform-unplated_targetsize-24.png │ │ │ ├── Square44x44Logo.altform-unplated_targetsize-256.png │ │ │ ├── Square44x44Logo.altform-unplated_targetsize-32.png │ │ │ ├── Square44x44Logo.altform-unplated_targetsize-48.png │ │ │ ├── Square44x44Logo.scale-100.png │ │ │ ├── Square44x44Logo.scale-125.png │ │ │ ├── Square44x44Logo.scale-150.png │ │ │ ├── Square44x44Logo.scale-200.png │ │ │ ├── Square44x44Logo.scale-400.png │ │ │ ├── Square44x44Logo.targetsize-16.png │ │ │ ├── Square44x44Logo.targetsize-24.png │ │ │ ├── Square44x44Logo.targetsize-256.png │ │ │ ├── Square44x44Logo.targetsize-32.png │ │ │ ├── Square44x44Logo.targetsize-48.png │ │ │ ├── StoreLogo.backup.png │ │ │ ├── StoreLogo.scale-100.png │ │ │ ├── StoreLogo.scale-125.png │ │ │ ├── StoreLogo.scale-150.png │ │ │ ├── StoreLogo.scale-200.png │ │ │ ├── StoreLogo.scale-400.png │ │ │ ├── Wide310x150Logo.scale-100.png │ │ │ ├── Wide310x150Logo.scale-125.png │ │ │ ├── Wide310x150Logo.scale-150.png │ │ │ ├── Wide310x150Logo.scale-200.png │ │ │ └── Wide310x150Logo.scale-400.png │ │ ├── COLDSTART_LOGO_black.png │ │ ├── ColdStartChallenge.DriverApp.UWP.csproj │ │ ├── MainPage.xaml │ │ ├── MainPage.xaml.cs │ │ ├── Package.appxmanifest │ │ ├── Properties │ │ │ ├── AssemblyInfo.cs │ │ │ └── Default.rd.xml │ │ └── Truck.png │ │ ├── ColdStartChallenge.DriverApp.iOS │ │ ├── AppDelegate.cs │ │ ├── Assets.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ ├── Contents.json │ │ │ │ ├── Icon1024.png │ │ │ │ ├── Icon120.png │ │ │ │ ├── Icon152.png │ │ │ │ ├── Icon167.png │ │ │ │ ├── Icon180.png │ │ │ │ ├── Icon20.png │ │ │ │ ├── Icon29.png │ │ │ │ ├── Icon40.png │ │ │ │ ├── Icon58.png │ │ │ │ ├── Icon60.png │ │ │ │ ├── Icon76.png │ │ │ │ ├── Icon80.png │ │ │ │ └── Icon87.png │ │ ├── ColdStartChallenge.DriverApp.iOS.csproj │ │ ├── Entitlements.plist │ │ ├── Info.plist │ │ ├── Main.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ └── Resources │ │ │ ├── COLDSTART_LOGO_black.png │ │ │ ├── Default-568h@2x.png │ │ │ ├── Default-Portrait.png │ │ │ ├── Default-Portrait@2x.png │ │ │ ├── Default.png │ │ │ ├── Default@2x.png │ │ │ ├── LaunchScreen.storyboard │ │ │ └── Truck.png │ │ └── ColdStartChallenge.DriverApp │ │ ├── App.xaml │ │ ├── App.xaml.cs │ │ ├── AppData.cs │ │ ├── AssemblyInfo.cs │ │ ├── ColdStartChallenge.DriverApp.csproj │ │ ├── Controls │ │ ├── LoadingView.xaml │ │ └── LoadingView.xaml.cs │ │ ├── Converters │ │ └── SelectedSortOptionToColorConverter.cs │ │ ├── Models │ │ ├── CacheKeys.cs │ │ ├── Constants.cs │ │ ├── Driver.cs │ │ ├── Enum.cs │ │ ├── Icecream.cs │ │ ├── Location.cs │ │ ├── MdiFontIcons.cs │ │ ├── Order.cs │ │ ├── OrderStatus.cs │ │ └── SortOption.cs │ │ ├── Navigation │ │ └── NavigationMode.cs │ │ ├── Pages │ │ ├── DashboardPage.xaml │ │ ├── DashboardPage.xaml.cs │ │ ├── DeliveryDetailPage.xaml │ │ ├── DeliveryDetailPage.xaml.cs │ │ ├── LoginPage.xaml │ │ └── LoginPage.xaml.cs │ │ ├── Resources │ │ ├── Fonts │ │ │ └── materialdesignicons-webfont.ttf │ │ ├── Styles.xaml │ │ └── Styles.xaml.cs │ │ ├── Services │ │ ├── CredentialsService.cs │ │ ├── DriverService.cs │ │ ├── LocationService.cs │ │ ├── LoginService.cs │ │ └── OrderService.cs │ │ └── ViewModels │ │ ├── BindableBase.cs │ │ ├── DashboardPageViewModel.cs │ │ ├── DeliveryDetailPageViewModel.cs │ │ ├── LoginPageViewModel.cs │ │ ├── OrderListItemViewModel.cs │ │ └── ViewModelBase.cs │ └── coldstartapi │ ├── .funcignore │ ├── .gitignore │ ├── .vscode │ ├── extensions.json │ ├── launch.json │ ├── settings.json │ └── tasks.json │ ├── host.json │ ├── myorders-get │ ├── function.json │ └── index.js │ ├── orders-get │ ├── function.json │ └── index.js │ ├── orders-put │ ├── function.json │ └── index.js │ ├── orders-queued │ ├── function.json │ └── index.js │ ├── orders-timer │ ├── function.json │ └── index.js │ ├── package-lock.json │ ├── package.json │ ├── proxies.json │ └── shared │ ├── catalog-data.js │ ├── config.js │ ├── cosmosdb-utils.js │ ├── driver-data.js │ ├── order-cosmos-data.js │ ├── sql-utils.js │ └── user-utils.js └── challenge5 ├── README.md └── starter └── data └── coldstart-historical-sales.csv /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/challenge-solution-submission.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Challenge Solution Submission 3 | about: Submit your solution for the ColdStart coding challenges. 4 | title: "[CHALLENGE SUBMISSION]" 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | Please provide the following information for your submission: 11 | 12 | What is your name (First, Last): 13 | 14 | Where is your GitHub Repo (with your challenge solution): 15 | 16 | What Challenge is this for (challenge number between 1 and 6): 17 | 18 | (Optional) Anything else we should know? e.g., language used, location, blog post? 19 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 ColdStart-Challenge 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /assets/2007_Snow-Hill-Island_Luyten-De-Hauwere-Emperor-Penguin-56.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/assets/2007_Snow-Hill-Island_Luyten-De-Hauwere-Emperor-Penguin-56.jpg -------------------------------------------------------------------------------- /assets/COLDSTART-INSIDE-FACTORY2-500x275.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/assets/COLDSTART-INSIDE-FACTORY2-500x275.png -------------------------------------------------------------------------------- /assets/COLDSTART-STAMP-CARD-BOTH-400x267.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/assets/COLDSTART-STAMP-CARD-BOTH-400x267.png -------------------------------------------------------------------------------- /assets/COLDSTART-TRUCK-400x300.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/assets/COLDSTART-TRUCK-400x300.png -------------------------------------------------------------------------------- /assets/RaspberryPi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/assets/RaspberryPi.jpg -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": "api", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install", 10 | "options": { 11 | "cwd": "${workspaceFolder}/api" 12 | } 13 | }, 14 | { 15 | "type": "shell", 16 | "label": "npm install", 17 | "command": "npm install", 18 | "options": { 19 | "cwd": "${workspaceFolder}/api" 20 | } 21 | }, 22 | { 23 | "type": "shell", 24 | "label": "npm prune", 25 | "command": "npm prune --production", 26 | "problemMatcher": [], 27 | "options": { 28 | "cwd": "${workspaceFolder}/api" 29 | } 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | local.settings.json 6 | test 7 | tsconfig.json -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/catalog-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "catalog" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/catalog-get/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/catalog-data'); 2 | 3 | module.exports = async function (context, req) { 4 | try { 5 | const items = await data.getCatalog(); 6 | context.res.status(200).send(items); 7 | } catch (error) { 8 | context.res.status(500).send(error); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "extensionBundle": { 4 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 5 | "version": "[1.*, 2.0.0)" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/orders-post/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": [ 9 | "post" 10 | ], 11 | "route": "orders" 12 | }, 13 | { 14 | "type": "http", 15 | "direction": "out", 16 | "name": "res" 17 | }, 18 | { 19 | "type": "queue", 20 | "direction": "out", 21 | "name": "myQueueItem", 22 | "queueName": "customer-orders", 23 | "connection": "AZURE_STORAGE_CONNECTIONSTRING" 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/orders-post/index.js: -------------------------------------------------------------------------------- 1 | const { getUser } = require('../shared/user-utils'); 2 | var uuid = require('uuid'); 3 | 4 | 5 | module.exports = async function (context, req) { 6 | // Get the user details from the request 7 | const user = getUser(req); 8 | 9 | // Build the pre-order JSON from the request 10 | const order = { 11 | Id: uuid.v4(), 12 | User: user.userDetails, 13 | FullAddress: req.body.ShippingAddress, 14 | Date: new Date().toISOString(), 15 | IcecreamId: req.body.Id, 16 | Status: "New", 17 | DriverId: null, 18 | LastPosition: null 19 | }; 20 | 21 | try { 22 | // Add the pre-order JSON document in a queue 23 | console.log('Queueing order'); 24 | context.bindings.myQueueItem = order; 25 | 26 | context.res.status(201).json(order); 27 | context.done(); 28 | } catch (error) { 29 | console.error(error); 30 | context.res.status(500).send(error); 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-functions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "func start", 7 | "test": "echo \"No tests yet...\"" 8 | }, 9 | "dependencies": { 10 | "uuid": "^8.3.2" 11 | }, 12 | "devDependencies": {} 13 | } 14 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/proxies.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/proxies", 3 | "proxies": {} 4 | } 5 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/shared/catalog-data.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs').promises; 2 | 3 | async function getCatalog() { 4 | console.log('using static data.'); 5 | var stringData = await fs.readFile('./shared/catalog.json', 'utf8'); 6 | const data = JSON.parse(stringData); 7 | return data.icecreams; 8 | } 9 | 10 | module.exports = { getCatalog }; 11 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/api/shared/user-utils.js: -------------------------------------------------------------------------------- 1 | const getUser = (req) => { 2 | const header = req.headers["x-ms-client-principal"]; 3 | if (header != undefined) { 4 | const encoded = Buffer.from(header, "base64"); 5 | const decoded = encoded.toString("ascii"); 6 | 7 | return JSON.parse(decoded); 8 | } else { 9 | return { userDetails: "John Doe" }; 10 | } 11 | }; 12 | 13 | module.exports = { getUser }; -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['@vue/airbnb', 'plugin:vue/essential'], 7 | // plugins: ['prettier'], 8 | // watch this for explaining why some of this is here 9 | // https://www.youtube.com/watch?time_continue=239&v=YIvjKId9m2c 10 | rules: { 11 | 'no-console': 'off', // process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 13 | 'consistent-return': 0, 14 | 'linebreak-style': 'off', 15 | quotes: [2, 'single', { avoidEscape: true, allowTemplateLiterals: true }], 16 | // 'prettier/prettier': [ 17 | // 'error', 18 | // { 19 | // trailingComma: 'all', 20 | // singleQuote: true, 21 | // printWidth: 80, 22 | // }, 23 | // ], 24 | 'vue/no-unused-components': [ 25 | 'error', 26 | { 27 | ignoreWhenBindingPresent: true, 28 | }, 29 | ], 30 | }, 31 | parserOptions: { 32 | parser: 'babel-eslint', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | # .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "singleQuote": true, 5 | "tabWidth": 2, 6 | "trailingComma": "all", 7 | "useTabs": false 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-vue-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "test:e2e": "vue-cli-service test:e2e", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "@fortawesome/fontawesome-svg-core": "^1.2.28", 13 | "@fortawesome/free-solid-svg-icons": "^5.13.0", 14 | "@fortawesome/vue-fontawesome": "^0.1.9", 15 | "axios": "^0.19.2", 16 | "bulma": "^0.8.1", 17 | "core-js": "^3.6.5", 18 | "vue": "^2.6.11", 19 | "vue-router": "^3.1.5", 20 | "vuex": "^3.1.3" 21 | }, 22 | "devDependencies": { 23 | "@vue/cli-plugin-babel": "~4.3.1", 24 | "@vue/cli-plugin-eslint": "~4.3.1", 25 | "@vue/cli-service": "~4.3.1", 26 | "@vue/eslint-config-airbnb": "^5.0.2", 27 | "@vue/eslint-config-prettier": "^6.0.0", 28 | "babel-eslint": "^10.0.3", 29 | "eslint": "^6.7.2", 30 | "eslint-plugin-import": "^2.20.2", 31 | "eslint-plugin-prettier": "^3.1.2", 32 | "eslint-plugin-vue": "^6.2.2", 33 | "node-sass": "^4.14.1", 34 | "prettier": "^2.0.4", 35 | "sass-loader": "^8.0.2", 36 | "vue-template-compiler": "^2.6.11" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 404 - Page Not Found 7 | 16 | 17 | 18 |

404 - Page Not Found

19 |
20 | 21 |
22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/finished/coldstartapp/vue-app/public/favicon.ico -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 19 | ColdStart Ice Cream 20 | 21 | 22 | 23 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/public/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "route": "/.auth/login/facebook", 5 | "statusCode": "404" 6 | }, 7 | { 8 | "route": "/.auth/login/google", 9 | "statusCode": "404" 10 | }, 11 | { 12 | "route": "/api/catalog" 13 | }, 14 | { 15 | "route": "/api/*", 16 | "allowedRoles": ["authenticated"] 17 | }, 18 | { 19 | "route": "/*", 20 | "serve": "/index.html", 21 | "statusCode": 200 22 | } 23 | ], 24 | "platformErrorOverrides": [ 25 | { 26 | "errorType": "NotFound", 27 | "serve": "/404.html" 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/app.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/assets/js/userInfo.js: -------------------------------------------------------------------------------- 1 | async function getUserInfo() { 2 | try { 3 | console.log('getUserInfo'); 4 | const response = await fetch('/.auth/me'); 5 | const payload = await response.json(); 6 | const { clientPrincipal } = payload; 7 | console.log(clientPrincipal); 8 | return clientPrincipal; 9 | } catch (error) { 10 | console.error('No profile could be found'); 11 | return undefined; 12 | } 13 | } 14 | 15 | export { getUserInfo as default }; 16 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/finished/coldstartapp/vue-app/src/assets/logo.png -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/auth-login.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/auth-logout.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/button-footer.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 51 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/card-content.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 41 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/header-bar-brand.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/list-header.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 43 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/components/page-not-found.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from '@/app.vue'; 3 | import router from './router'; 4 | import store from './store'; 5 | 6 | Vue.config.productionTip = false; 7 | 8 | new Vue({ 9 | router, 10 | store, 11 | render: (h) => h(App), 12 | }).$mount('#app'); 13 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | import PageNotFound from '@/components/page-not-found.vue'; 4 | 5 | Vue.use(Router); 6 | 7 | export default new Router({ 8 | mode: 'history', 9 | base: process.env.BASE_URL, 10 | routes: [ 11 | { 12 | path: '/', 13 | redirect: '/catalog', 14 | }, 15 | { 16 | path: '/catalog', 17 | name: 'catalog', 18 | component: () => import(/* webpackChunkName: "catalog" */ './views/catalog/catalog.vue'), 19 | }, 20 | { 21 | path: '*', 22 | component: PageNotFound, 23 | }, 24 | ], 25 | }); 26 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/store/config.js: -------------------------------------------------------------------------------- 1 | const API = process.env.VUE_APP_API || 'api'; 2 | 3 | export { API as default }; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import icecreamsModule from './modules/icecreams'; 4 | import catalogModule from './modules/catalog'; 5 | 6 | Vue.use(Vuex); 7 | 8 | export default new Vuex.Store({ 9 | strict: process.env.NODE_ENV !== 'production', 10 | modules: { 11 | icecreams: icecreamsModule, 12 | catalog: catalogModule, 13 | }, 14 | state: { 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/store/modules/action-utils.js: -------------------------------------------------------------------------------- 1 | export const parseList = (response) => { 2 | if (response.status !== 200) throw Error(response.message); 3 | let list = response.data; 4 | if (typeof list !== 'object') { 5 | list = []; 6 | } 7 | return list; 8 | }; 9 | 10 | export const parseItem = (response, code) => { 11 | if (response.status !== code) throw Error(response.message); 12 | let item = response.data; 13 | if (typeof item !== 'object') { 14 | item = undefined; 15 | } 16 | return item; 17 | }; 18 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/store/modules/catalog.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import API from '../config'; 3 | import { parseList } from './action-utils'; 4 | import { 5 | GET_CATALOG, 6 | } from './mutation-types'; 7 | 8 | const captains = console; 9 | 10 | export default { 11 | strict: process.env.NODE_ENV !== 'production', 12 | namespaced: true, 13 | state: { 14 | catalog: [], 15 | }, 16 | mutations: { 17 | [GET_CATALOG](state, catalog) { 18 | state.catalog = catalog; 19 | }, 20 | }, 21 | actions: { 22 | async getCatalogAction({ commit }) { 23 | try { 24 | const response = await axios.get(`${API}/catalog`); 25 | const catalog = parseList(response); 26 | commit(GET_CATALOG, catalog); 27 | return catalog; 28 | } catch (error) { 29 | captains.error(error); 30 | throw new Error(error); 31 | } 32 | }, 33 | }, 34 | getters: { 35 | catalog: (state) => state.catalog, 36 | }, 37 | }; 38 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/src/store/modules/mutation-types.js: -------------------------------------------------------------------------------- 1 | export const ADD_ICECREAM = 'ADD_ICECREAM'; 2 | export const GET_ICECREAMS = 'GET_ICECREAMS'; 3 | export const GET_CATALOG = 'GET_CATALOG'; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/finished/coldstartapp/vue-app/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | configureWebpack: { 3 | devtool: 'source-map', 4 | }, 5 | devServer: { 6 | proxy: { 7 | '/api': { 8 | target: 'http://localhost:7071', 9 | ws: true, 10 | changeOrigin: true, 11 | }, 12 | }, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/README.md: -------------------------------------------------------------------------------- 1 | # ColdStart Web Application - Getting started 2 | 3 | ## Introduction 4 | 5 | This is a starter web application for Azure Static Web Apps. It consists of two components: 6 | 7 | - Vue.js frontend 8 | - Node.js backend apis, running on Azure Functions 9 | 10 | 11 | ## Running the solution locally 12 | 13 | ### Frontend 14 | 15 | The frontend application is developed using Vue.js. It will communicate directly with the backend APIs included in the starter application. 16 | 17 | ```cmd 18 | cd vue-app 19 | npm install 20 | npm run serve 21 | ``` 22 | 23 | ### Backend APIs 24 | 25 | The backend APIs are hosted using Azure Functions and can be run locally using the Azure Functions Core Tools. 26 | 27 | > Make sure to rename `local.setting.json` to `local.settings.json`. The setting**s** file is excluded to not expose any local secrets in the GitHub repository. 28 | 29 | 30 | ```cmd 31 | cd api 32 | npm install 33 | npm start 34 | ``` 35 | 36 | ## Prerequisites 37 | 38 | - ✅ [Visual Studio Code](https://code.visualstudio.com?ocid=aid3027557) 39 | - ✅ [Aure Functions Core Tools](https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local?ocid=aid3027557) 40 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | local.settings.json 6 | test 7 | tsconfig.json -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/catalog-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "catalog" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/catalog-get/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/catalog-data'); 2 | 3 | module.exports = async function (context, req) { 4 | try { 5 | const items = await data.getCatalog(); 6 | context.res.status(200).send(items); 7 | } catch (error) { 8 | context.res.status(500).send(error); 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "extensionBundle": { 4 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 5 | "version": "[1.*, 2.0.0)" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/local.setting.json: -------------------------------------------------------------------------------- 1 | { 2 | "IsEncrypted": false, 3 | "Values": { 4 | "AzureWebJobsStorage": "", 5 | "FUNCTIONS_WORKER_RUNTIME": "node" 6 | }, 7 | "Host": { 8 | "CORS": "http://localhost:3000,http://localhost:4200,http://localhost:5000,http://localhost:8080" 9 | } 10 | } -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/orders-post/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["post"], 9 | "route": "orders" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/orders-post/index.js: -------------------------------------------------------------------------------- 1 | const { getUser } = require('../shared/user-utils'); 2 | 3 | module.exports = async function (context, req) { 4 | // Get the user details from the request 5 | const user = getUser(req); 6 | 7 | // Get the pre-order from the request 8 | 9 | // TODO: add the pre-order JSON document in a queue 10 | 11 | context.res.status(201); 12 | }; 13 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-functions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "func start", 7 | "test": "echo \"No tests yet...\"" 8 | }, 9 | "dependencies": { 10 | "@azure/storage-queue": "^12.3.0", 11 | "tedious": "^11.0.3" 12 | }, 13 | "devDependencies": {} 14 | } 15 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/proxies.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/proxies", 3 | "proxies": {} 4 | } 5 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/shared/catalog-data.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs').promises; 2 | 3 | async function getCatalog() { 4 | console.log('using static data.'); 5 | var stringData = await fs.readFile('./shared/catalog.json', 'utf8'); 6 | const data = JSON.parse(stringData); 7 | return data.icecreams; 8 | } 9 | 10 | module.exports = { getCatalog }; 11 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/shared/config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const process = require("process"); 3 | 4 | const config = { 5 | azure_storage_connectionstring: process.env.AZURE_STORAGE_CONNECTIONSTRING 6 | }; 7 | 8 | module.exports = { config }; 9 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/api/shared/user-utils.js: -------------------------------------------------------------------------------- 1 | const getUser = (req) => { 2 | const header = req.headers["x-ms-client-principal"]; 3 | if (header != undefined) { 4 | const encoded = Buffer.from(header, "base64"); 5 | const decoded = encoded.toString("ascii"); 6 | 7 | return JSON.parse(decoded); 8 | } else { 9 | return { userDetails: "John Doe" }; 10 | } 11 | }; 12 | 13 | module.exports = { getUser }; -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['@vue/airbnb', 'plugin:vue/essential'], 7 | // plugins: ['prettier'], 8 | // watch this for explaining why some of this is here 9 | // https://www.youtube.com/watch?time_continue=239&v=YIvjKId9m2c 10 | rules: { 11 | 'no-console': 'off', // process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 13 | 'consistent-return': 0, 14 | 'linebreak-style': 'off', 15 | quotes: [2, 'single', { avoidEscape: true, allowTemplateLiterals: true }], 16 | // 'prettier/prettier': [ 17 | // 'error', 18 | // { 19 | // trailingComma: 'all', 20 | // singleQuote: true, 21 | // printWidth: 80, 22 | // }, 23 | // ], 24 | 'vue/no-unused-components': [ 25 | 'error', 26 | { 27 | ignoreWhenBindingPresent: true, 28 | }, 29 | ], 30 | }, 31 | parserOptions: { 32 | parser: 'babel-eslint', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | # .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "singleQuote": true, 5 | "tabWidth": 2, 6 | "trailingComma": "all", 7 | "useTabs": false 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-vue-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "test:e2e": "vue-cli-service test:e2e", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "@fortawesome/fontawesome-svg-core": "^1.2.28", 13 | "@fortawesome/free-solid-svg-icons": "^5.13.0", 14 | "@fortawesome/vue-fontawesome": "^0.1.9", 15 | "axios": "^0.19.2", 16 | "bulma": "^0.8.1", 17 | "core-js": "^3.6.5", 18 | "vue": "^2.6.11", 19 | "vue-router": "^3.1.5", 20 | "vuex": "^3.1.3" 21 | }, 22 | "devDependencies": { 23 | "@vue/cli-plugin-babel": "~4.3.1", 24 | "@vue/cli-plugin-eslint": "~4.3.1", 25 | "@vue/cli-service": "~4.3.1", 26 | "@vue/eslint-config-airbnb": "^5.0.2", 27 | "@vue/eslint-config-prettier": "^6.0.0", 28 | "babel-eslint": "^10.0.3", 29 | "eslint": "^6.7.2", 30 | "eslint-plugin-import": "^2.20.2", 31 | "eslint-plugin-prettier": "^3.1.2", 32 | "eslint-plugin-vue": "^6.2.2", 33 | "node-sass": "^4.14.1", 34 | "prettier": "^2.0.4", 35 | "sass-loader": "^8.0.2", 36 | "vue-template-compiler": "^2.6.11" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 404 - Page Not Found 7 | 16 | 17 | 18 |

404 - Page Not Found

19 |
20 | 21 |
22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/starter/coldstartapp/vue-app/public/favicon.ico -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 19 | ColdStart Ice Cream 20 | 21 | 22 | 23 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/public/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "route": "/api/catalog" 5 | }, 6 | { 7 | "route": "/*", 8 | "serve": "/index.html", 9 | "statusCode": 200 10 | } 11 | ], 12 | "platformErrorOverrides": [ 13 | { 14 | "errorType": "NotFound", 15 | "serve": "/404.html" 16 | } 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/app.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/starter/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/starter/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/assets/js/userInfo.js: -------------------------------------------------------------------------------- 1 | async function getUserInfo() { 2 | try { 3 | console.log('getUserInfo'); 4 | const response = await fetch('/.auth/me'); 5 | const payload = await response.json(); 6 | const { clientPrincipal } = payload; 7 | console.log(clientPrincipal); 8 | return clientPrincipal; 9 | } catch (error) { 10 | console.error('No profile could be found'); 11 | return undefined; 12 | } 13 | } 14 | 15 | export { getUserInfo as default }; 16 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge1/starter/coldstartapp/vue-app/src/assets/logo.png -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/auth-login.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/auth-logout.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/button-footer.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 51 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/card-content.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 41 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/header-bar-brand.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/header-bar.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 30 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/list-header.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 43 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/components/page-not-found.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from '@/app.vue'; 3 | import router from './router'; 4 | import store from './store'; 5 | 6 | Vue.config.productionTip = false; 7 | 8 | new Vue({ 9 | router, 10 | store, 11 | render: (h) => h(App), 12 | }).$mount('#app'); 13 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | import PageNotFound from '@/components/page-not-found.vue'; 4 | 5 | Vue.use(Router); 6 | 7 | export default new Router({ 8 | mode: 'history', 9 | base: process.env.BASE_URL, 10 | routes: [ 11 | { 12 | path: '/', 13 | redirect: '/catalog', 14 | }, 15 | { 16 | path: '/catalog', 17 | name: 'catalog', 18 | component: () => import(/* webpackChunkName: "catalog" */ './views/catalog/catalog.vue'), 19 | }, 20 | { 21 | path: '*', 22 | component: PageNotFound, 23 | }, 24 | ], 25 | }); 26 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/store/config.js: -------------------------------------------------------------------------------- 1 | const API = process.env.VUE_APP_API || 'api'; 2 | 3 | export { API as default }; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import catalogModule from './modules/catalog'; 4 | 5 | Vue.use(Vuex); 6 | 7 | export default new Vuex.Store({ 8 | strict: process.env.NODE_ENV !== 'production', 9 | modules: { 10 | catalog: catalogModule, 11 | }, 12 | state: { 13 | }, 14 | }); 15 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/store/modules/action-utils.js: -------------------------------------------------------------------------------- 1 | export const parseList = (response) => { 2 | if (response.status !== 200) throw Error(response.message); 3 | let list = response.data; 4 | if (typeof list !== 'object') { 5 | list = []; 6 | } 7 | return list; 8 | }; 9 | 10 | export const parseItem = (response, code) => { 11 | if (response.status !== code) throw Error(response.message); 12 | let item = response.data; 13 | if (typeof item !== 'object') { 14 | item = undefined; 15 | } 16 | return item; 17 | }; 18 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/store/modules/catalog.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import API from '../config'; 3 | import { parseList } from './action-utils'; 4 | import GET_CATALOG from './mutation-types'; 5 | 6 | const captains = console; 7 | 8 | export default { 9 | strict: process.env.NODE_ENV !== 'production', 10 | namespaced: true, 11 | state: { 12 | catalog: [], 13 | }, 14 | mutations: { 15 | [GET_CATALOG](state, catalog) { 16 | state.catalog = catalog; 17 | }, 18 | }, 19 | actions: { 20 | async getCatalogAction({ commit }) { 21 | try { 22 | const response = await axios.get(`${API}/catalog`); 23 | const catalog = parseList(response); 24 | commit(GET_CATALOG, catalog); 25 | return catalog; 26 | } catch (error) { 27 | captains.error(error); 28 | throw new Error(error); 29 | } 30 | }, 31 | }, 32 | getters: { 33 | catalog: (state) => state.catalog, 34 | }, 35 | }; 36 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/store/modules/mutation-types.js: -------------------------------------------------------------------------------- 1 | const GET_CATALOG = 'GET_CATALOG'; 2 | 3 | export { GET_CATALOG as default }; 4 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/src/views/catalog/catalog-list.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 51 | -------------------------------------------------------------------------------- /challenges/challenge1/starter/coldstartapp/vue-app/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | configureWebpack: { 3 | devtool: 'source-map', 4 | }, 5 | devServer: { 6 | proxy: { 7 | '/api': { 8 | target: 'http://localhost:7071', 9 | ws: true, 10 | changeOrigin: true, 11 | }, 12 | }, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/Data Factory/arm_template.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge2/finished/Data Factory/arm_template.zip -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": "api", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install", 10 | "options": { 11 | "cwd": "${workspaceFolder}/api" 12 | } 13 | }, 14 | { 15 | "type": "shell", 16 | "label": "npm install", 17 | "command": "npm install", 18 | "options": { 19 | "cwd": "${workspaceFolder}/api" 20 | } 21 | }, 22 | { 23 | "type": "shell", 24 | "label": "npm prune", 25 | "command": "npm prune --production", 26 | "problemMatcher": [], 27 | "options": { 28 | "cwd": "${workspaceFolder}/api" 29 | } 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | local.settings.json 6 | test 7 | tsconfig.json -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/catalog-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "catalog" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/catalog-get/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/catalog-data'); 2 | 3 | module.exports = async function (context, req) { 4 | try { 5 | const items = await data.getCatalog(); 6 | const result = JSON.stringify(items); 7 | context.res.status(200).send(result); 8 | } catch (error) { 9 | context.res.status(500).send(error); 10 | } 11 | }; 12 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "extensionBundle": { 4 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 5 | "version": "[1.*, 2.0.0)" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/local.setting.json: -------------------------------------------------------------------------------- 1 | { 2 | "IsEncrypted": false, 3 | "Values": { 4 | "AzureWebJobsStorage": "", 5 | "FUNCTIONS_WORKER_RUNTIME": "node" 6 | }, 7 | "Host": { 8 | "CORS": "http://localhost:3000,http://localhost:4200,http://localhost:5000,http://localhost:8080" 9 | } 10 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/orders-post/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": [ 9 | "post" 10 | ], 11 | "route": "orders" 12 | }, 13 | { 14 | "type": "http", 15 | "direction": "out", 16 | "name": "res" 17 | }, 18 | { 19 | "type": "queue", 20 | "direction": "out", 21 | "name": "myQueueItem", 22 | "queueName": "customer-orders", 23 | "connection": "AZURE_STORAGE_CONNECTIONSTRING" 24 | } 25 | ] 26 | } -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-functions", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "func start", 7 | "test": "echo \"No tests yet...\"" 8 | }, 9 | "dependencies": { 10 | "@azure/cognitiveservices-personalizer": "^2.0.1", 11 | "@azure/ms-rest-azure-js": "^2.1.0", 12 | "@azure/storage-queue": "^12.3.0", 13 | "detect-browser": "^5.2.0", 14 | "mssql": "^6.3.1" 15 | }, 16 | "devDependencies": {} 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/proxies.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/proxies", 3 | "proxies": {} 4 | } 5 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/recommendations-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "recommendations" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/recommendations-get/index.js: -------------------------------------------------------------------------------- 1 | const { getUser } = require('../shared/user-utils'); 2 | const data = require('../shared/recommendation-data'); 3 | 4 | module.exports = async function (context, req) { 5 | // Get the user details from the request 6 | const user = getUser(req); 7 | 8 | try { 9 | const items = await data.getRecommendations(user.userDetails, req); 10 | 11 | const result = JSON.stringify(items); 12 | context.res.status(200).send(result); 13 | } catch (error) { 14 | context.res.status(500).send(error); 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/recommendations-post/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["post"], 9 | "route": "recommendations" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/recommendations-post/index.js: -------------------------------------------------------------------------------- 1 | const { getUser } = require('../shared/user-utils'); 2 | const data = require('../shared/recommendation-data'); 3 | 4 | module.exports = async function (context, req) { 5 | try { 6 | console.log(`Event id: ${req.body.eventId}, Reward score: ${req.body.rewardScore}`); 7 | await data.setReward(req.body.eventId, req.body.rewardScore); 8 | 9 | context.res.status(200); 10 | } catch (error) { 11 | context.res.status(500).send(error); 12 | } 13 | }; 14 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/shared/catalog-data.js: -------------------------------------------------------------------------------- 1 | const { sqlConfig } = require("./config"); 2 | const mssql = require('mssql'); 3 | 4 | async function getCatalog() { 5 | console.log('using database '); 6 | 7 | let pool = await mssql.connect(sqlConfig); 8 | let result = await pool.request() 9 | .query(`SELECT * FROM dbo.Icecreams ORDER BY [Id]`); 10 | 11 | return result.recordset; 12 | } 13 | 14 | module.exports = { getCatalog }; 15 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/shared/config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const process = require("process"); 3 | 4 | const config = { 5 | azure_storage_connectionstring: process.env.AZURE_STORAGE_CONNECTIONSTRING, 6 | personalizer_key: process.env.PERSONALIZER_KEY, 7 | personalizer_baseuri: process.env.PERSONALIZER_BASEURI, 8 | }; 9 | 10 | const sqlConfig = { 11 | user: process.env.SQL_USERNAME, 12 | password: process.env.SQL_PASSWORD, 13 | server: process.env.SQL_SERVERNAME, 14 | database: 'coldstartsql', 15 | pool: { 16 | max: 10, 17 | min: 0, 18 | idleTimeoutMillis: 30000 19 | } 20 | }; 21 | 22 | module.exports = { config, sqlConfig }; 23 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/shared/order-data.js: -------------------------------------------------------------------------------- 1 | const { sqlConfig } = require("./config"); 2 | const mssql = require('mssql'); 3 | 4 | async function insertOrder(order) { 5 | console.log('using database '); 6 | 7 | let pool = await mssql.connect(sqlConfig); 8 | let result = await pool.request() 9 | .input('userId', mssql.NVarChar, order.User) 10 | .input('icecreamId', mssql.Int, order.IcecreamId) 11 | .input('fullAddress', mssql.NVarChar, order.FullAddress) 12 | .query(`INSERT INTO dbo.Orders ([User], [IcecreamId], [FullAddress]) VALUES (@userId, @icecreamId, @fullAddress)`); 13 | }; 14 | 15 | async function getLastOrder(userId) { 16 | console.log('using database '); 17 | 18 | let pool = await mssql.connect(sqlConfig); 19 | let result = await pool.request() 20 | .input('userId', mssql.NVarChar, userId) 21 | .query(`SELECT TOP 1 * FROM dbo.orders WHERE [User] = @userId ORDER BY [Date] DESC`); 22 | 23 | return result.recordset; 24 | }; 25 | 26 | module.exports = { insertOrder, getLastOrder }; 27 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/api/shared/user-utils.js: -------------------------------------------------------------------------------- 1 | const getUser = (req) => { 2 | const header = req.headers["x-ms-client-principal"]; 3 | if (header != undefined) { 4 | const encoded = Buffer.from(header, "base64"); 5 | const decoded = encoded.toString("ascii"); 6 | 7 | return JSON.parse(decoded); 8 | } else { 9 | return { userDetails: "anonymous" }; 10 | } 11 | }; 12 | 13 | module.exports = { getUser }; -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true, 5 | }, 6 | extends: ['@vue/airbnb', 'plugin:vue/essential'], 7 | // plugins: ['prettier'], 8 | // watch this for explaining why some of this is here 9 | // https://www.youtube.com/watch?time_continue=239&v=YIvjKId9m2c 10 | rules: { 11 | 'no-console': 'off', // process.env.NODE_ENV === 'production' ? 'error' : 'off', 12 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 13 | 'consistent-return': 0, 14 | 'linebreak-style': 'off', 15 | quotes: [2, 'single', { avoidEscape: true, allowTemplateLiterals: true }], 16 | // 'prettier/prettier': [ 17 | // 'error', 18 | // { 19 | // trailingComma: 'all', 20 | // singleQuote: true, 21 | // printWidth: 80, 22 | // }, 23 | // ], 24 | 'vue/no-unused-components': [ 25 | 'error', 26 | { 27 | ignoreWhenBindingPresent: true, 28 | }, 29 | ], 30 | }, 31 | parserOptions: { 32 | parser: 'babel-eslint', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | # .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "printWidth": 80, 4 | "singleQuote": true, 5 | "tabWidth": 2, 6 | "trailingComma": "all", 7 | "useTabs": false 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstart-vue-app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "test:e2e": "vue-cli-service test:e2e", 9 | "lint": "vue-cli-service lint" 10 | }, 11 | "dependencies": { 12 | "@fortawesome/fontawesome-svg-core": "^1.2.28", 13 | "@fortawesome/free-solid-svg-icons": "^5.13.0", 14 | "@fortawesome/vue-fontawesome": "^0.1.9", 15 | "axios": "^0.19.2", 16 | "bulma": "^0.8.1", 17 | "core-js": "^3.6.5", 18 | "vue": "^2.6.11", 19 | "vue-router": "^3.1.5", 20 | "vuex": "^3.1.3" 21 | }, 22 | "devDependencies": { 23 | "@vue/cli-plugin-babel": "~4.3.1", 24 | "@vue/cli-plugin-eslint": "~4.3.1", 25 | "@vue/cli-service": "~4.3.1", 26 | "@vue/eslint-config-airbnb": "^5.0.2", 27 | "@vue/eslint-config-prettier": "^6.0.0", 28 | "babel-eslint": "^10.0.3", 29 | "eslint": "^6.7.2", 30 | "eslint-plugin-import": "^2.20.2", 31 | "eslint-plugin-prettier": "^3.1.2", 32 | "eslint-plugin-vue": "^6.2.2", 33 | "node-sass": "^4.14.1", 34 | "prettier": "^2.0.4", 35 | "sass-loader": "^8.0.2", 36 | "vue-template-compiler": "^2.6.11" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {}, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 404 - Page Not Found 7 | 16 | 17 | 18 |

404 - Page Not Found

19 |
20 | 21 |
22 | 23 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge2/finished/coldstartapp/vue-app/public/favicon.ico -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 14 | 19 | ColdStart Ice Cream 20 | 21 | 22 | 23 | 29 |
30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/public/routes.json: -------------------------------------------------------------------------------- 1 | { 2 | "routes": [ 3 | { 4 | "route": "/.auth/login/facebook", 5 | "statusCode": "404" 6 | }, 7 | { 8 | "route": "/.auth/login/google", 9 | "statusCode": "404" 10 | }, 11 | { 12 | "route": "/api/catalog" 13 | }, 14 | { 15 | "route": "/api/recommendations" 16 | }, 17 | { 18 | "route": "/api/*", 19 | "allowedRoles": ["authenticated"] 20 | }, 21 | { 22 | "route": "/*", 23 | "serve": "/index.html", 24 | "statusCode": 200 25 | } 26 | ], 27 | "platformErrorOverrides": [ 28 | { 29 | "errorType": "NotFound", 30 | "serve": "/404.html" 31 | } 32 | ] 33 | } 34 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/app.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 25 | 26 | 29 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge2/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-black.png -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge2/finished/coldstartapp/vue-app/src/assets/COLDSTART-LOGO-white.png -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/assets/js/userInfo.js: -------------------------------------------------------------------------------- 1 | async function getUserInfo() { 2 | try { 3 | console.log('getUserInfo'); 4 | const response = await fetch('/.auth/me'); 5 | const payload = await response.json(); 6 | const { clientPrincipal } = payload; 7 | console.log(clientPrincipal); 8 | return clientPrincipal; 9 | } catch (error) { 10 | console.error('No profile could be found'); 11 | return undefined; 12 | } 13 | } 14 | 15 | export { getUserInfo as default }; 16 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge2/finished/coldstartapp/vue-app/src/assets/logo.png -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/auth-login.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 24 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/auth-logout.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/button-footer.vue: -------------------------------------------------------------------------------- 1 | 36 | 37 | 51 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/card-content.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 41 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/header-bar-brand.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 14 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/list-header.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 43 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/components/page-not-found.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from '@/app.vue'; 3 | import router from './router'; 4 | import store from './store'; 5 | 6 | Vue.config.productionTip = false; 7 | 8 | new Vue({ 9 | router, 10 | store, 11 | render: (h) => h(App), 12 | }).$mount('#app'); 13 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | import PageNotFound from '@/components/page-not-found.vue'; 4 | 5 | Vue.use(Router); 6 | 7 | export default new Router({ 8 | mode: 'history', 9 | base: process.env.BASE_URL, 10 | routes: [ 11 | { 12 | path: '/', 13 | redirect: '/catalog', 14 | }, 15 | { 16 | path: '/catalog', 17 | name: 'catalog', 18 | component: () => import(/* webpackChunkName: "catalog" */ './views/catalog/catalog.vue'), 19 | }, 20 | { 21 | path: '*', 22 | component: PageNotFound, 23 | }, 24 | ], 25 | }); 26 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/store/config.js: -------------------------------------------------------------------------------- 1 | const API = process.env.VUE_APP_API || 'api'; 2 | 3 | export { API as default }; 4 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import icecreamsModule from './modules/icecreams'; 4 | import catalogModule from './modules/catalog'; 5 | import recommendationsModule from './modules/recommendations'; 6 | 7 | Vue.use(Vuex); 8 | 9 | export default new Vuex.Store({ 10 | strict: process.env.NODE_ENV !== 'production', 11 | modules: { 12 | icecreams: icecreamsModule, 13 | catalog: catalogModule, 14 | recommendations: recommendationsModule, 15 | }, 16 | state: { 17 | }, 18 | }); 19 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/store/modules/action-utils.js: -------------------------------------------------------------------------------- 1 | export const parseList = (response) => { 2 | if (response.status !== 200) throw Error(response.message); 3 | let list = response.data; 4 | if (typeof list !== 'object') { 5 | list = []; 6 | } 7 | return list; 8 | }; 9 | 10 | export const parseItem = (response, code) => { 11 | if (response.status !== code) throw Error(response.message); 12 | let item = response.data; 13 | if (typeof item !== 'object') { 14 | item = undefined; 15 | } 16 | return item; 17 | }; 18 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/store/modules/mutation-types.js: -------------------------------------------------------------------------------- 1 | export const ADD_ICECREAM = 'ADD_ICECREAM'; 2 | export const GET_ICECREAMS = 'GET_ICECREAMS'; 3 | export const GET_CATALOG = 'GET_CATALOG'; 4 | export const GET_RECOMMENDATIONS = 'GET_RECOMMENDATIONS'; 5 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/src/store/modules/recommendations.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import API from '../config'; 3 | import { parseList } from './action-utils'; 4 | import { 5 | GET_RECOMMENDATIONS, 6 | } from './mutation-types'; 7 | 8 | const captains = console; 9 | 10 | export default { 11 | strict: process.env.NODE_ENV !== 'production', 12 | namespaced: true, 13 | state: { 14 | recommendations: [], 15 | }, 16 | mutations: { 17 | [GET_RECOMMENDATIONS](state, recommendations) { 18 | state.recommendations = recommendations; 19 | }, 20 | }, 21 | actions: { 22 | async getRecommendationsAction({ commit }) { 23 | try { 24 | const response = await axios.get(`${API}/recommendations`); 25 | const recommendations = parseList(response); 26 | commit(GET_RECOMMENDATIONS, recommendations); 27 | return recommendations; 28 | } catch (error) { 29 | captains.error(error); 30 | throw new Error(error); 31 | } 32 | }, 33 | 34 | }, 35 | getters: { 36 | recommendations: (state) => state.recommendations, 37 | }, 38 | }; 39 | -------------------------------------------------------------------------------- /challenges/challenge2/finished/coldstartapp/vue-app/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | configureWebpack: { 3 | devtool: 'source-map', 4 | }, 5 | devServer: { 6 | proxy: { 7 | '/api': { 8 | target: 'http://localhost:7071', 9 | ws: true, 10 | changeOrigin: true, 11 | }, 12 | }, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /challenges/challenge2/starter/scripts/sql/create_table_drivers.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE dbo.Drivers ( 2 | [Id] int primary key clustered, 3 | [Name] nvarchar(255) not null, 4 | [ImageUrl] nvarchar(2000) DEFAULT 'https://coldstartsa.blob.core.windows.net/web/assets/Driver1.png' 5 | ) 6 | -------------------------------------------------------------------------------- /challenges/challenge2/starter/scripts/sql/create_table_icecreams.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE dbo.Icecreams ( 2 | [Id] int primary key clustered, 3 | [Name] nvarchar(255) not null, 4 | [Description] nvarchar(2000) not null, 5 | [ImageUrl] nvarchar(2000) not null 6 | ) 7 | -------------------------------------------------------------------------------- /challenges/challenge2/starter/scripts/sql/create_table_orders.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE dbo.Orders ( 2 | Id UNIQUEIDENTIFIER 3 | CONSTRAINT Guid_Default DEFAULT 4 | NEWSEQUENTIALID() ROWGUIDCOL, 5 | [User] nvarchar(255) not null, 6 | [Date] datetime not null DEFAULT (GETDATE()), 7 | [IcecreamId] int not null REFERENCES Icecreams(Id), 8 | [Status] nvarchar(100) not null DEFAULT 'New', 9 | [DriverId] int null REFERENCES Drivers(Id), 10 | [FullAddress] nvarchar(2000), 11 | [LastPosition] nvarchar(500) 12 | 13 | CONSTRAINT Guid_PK PRIMARY KEY (Id) 14 | ) 15 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | local.settings.json 6 | test 7 | tsconfig.json -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | } 9 | } 10 | }, 11 | "extensionBundle": { 12 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 13 | "version": "[1.*, 2.0.0)" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/orders-queued/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "name": "myQueueItem", 5 | "type": "queueTrigger", 6 | "direction": "in", 7 | "queueName": "customer-orders", 8 | "connection": "coldstartsa_STORAGE" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/orders-timer/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "name": "myTimer", 5 | "type": "timerTrigger", 6 | "direction": "in", 7 | "schedule": "0 */5 * * * *" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/orders-timer/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/order-cosmos-data'); 2 | 3 | /* This function will 'process' all accepted customer orders and send them to the production line. 4 | After processing, the orders will be updated to the 'Ready' state. 5 | The function will be triggered by a timer. 6 | */ 7 | module.exports = async function (context, myTimer) { 8 | var timeStamp = new Date().toISOString(); 9 | 10 | if (myTimer.isPastDue) { 11 | context.log('JavaScript is running late!'); 12 | } 13 | 14 | // Process all accepted customer orders - for sake of demonstration purposes just update their status 15 | await data.produceOrders(); 16 | 17 | context.log('JavaScript timer trigger function ran!', timeStamp); 18 | }; -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstartapi", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "func start", 7 | "test": "echo \"No tests yet...\"" 8 | }, 9 | "dependencies": { 10 | "@azure/cosmos": "^3.9.5", 11 | "tedious": "^11.0.3" 12 | }, 13 | "devDependencies": {} 14 | } 15 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/proxies.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/proxies", 3 | "proxies": {} 4 | } 5 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/shared/catalog-data.js: -------------------------------------------------------------------------------- 1 | const { config } = require("./config"); 2 | const { queryDatabase } = require("../shared/sql-utils"); 3 | 4 | /** 5 | * Get all catalog items 6 | * @returns collection of catalog items 7 | */ 8 | async function getCatalog() { 9 | console.log('using database '); 10 | return await queryDatabase(`SELECT * FROM dbo.Icecreams`) 11 | } 12 | 13 | /** 14 | * Get a catalog item by id 15 | * @param {integer} itemId 16 | * @returns 17 | */ 18 | async function getCatalogItemById(itemId) { 19 | console.log('using database '); 20 | return await queryDatabase(`SELECT * FROM dbo.Icecreams WHERE Id = ${itemId}`); 21 | } 22 | 23 | module.exports = { getCatalog, getCatalogItemById }; 24 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/shared/config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const process = require("process"); 3 | 4 | const config = { 5 | azure_storage_connectionstring: process.env.AZURE_STORAGE_CONNECTIONSTRING 6 | }; 7 | 8 | // Create connection to database 9 | const sqlConfig = { 10 | authentication: { 11 | options: { 12 | userName: process.env.SQL_USERNAME, 13 | password: process.env.SQL_PASSWORD, 14 | }, 15 | type: "default" 16 | }, 17 | server: process.env.SQL_SERVERNAME, 18 | options: { 19 | database: "coldstartsql", 20 | encrypt: true 21 | } 22 | }; 23 | 24 | const cosmosConfig = { 25 | cosmosdb_endpoint: process.env.COSMOSDB_ENDPOINT, 26 | cosmosdb_key: process.env.COSMOSDB_KEY, 27 | cosmosdb_databaseId: "coldstartdb", 28 | cosmosdb_ordersContainerId: "customerorders", 29 | cosmosdb_ordersPartitionKey: "id", 30 | }; 31 | 32 | module.exports = { config, sqlConfig, cosmosConfig }; 33 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/shared/driver-data.js: -------------------------------------------------------------------------------- 1 | const { config } = require("./config"); 2 | const { queryDatabase } = require("../shared/sql-utils"); 3 | 4 | const storageBaseUrl = "https://coldstartsa.blob.core.windows.net/web/assets/"; 5 | 6 | // Schema for drivers 7 | const data = { 8 | drivers: [ 9 | { 10 | driverId: 1, 11 | name: 'Daisy Driver', 12 | imageUrl: storageBaseUrl + 'Driver1.png' 13 | }, 14 | { 15 | driverId: 2, 16 | name: 'Donny Driver', 17 | imageUrl: storageBaseUrl + 'Driver1.png' 18 | }, 19 | ], 20 | }; 21 | 22 | /** 23 | * Get a driver by it's id 24 | * @param {integer} driverId 25 | * @returns 26 | */ 27 | async function getDriverById(driverId) { 28 | console.log('using database '); 29 | return await queryDatabase(`SELECT [Id] as driverId, [Name] as name, [ImageUrl] as imageUrl FROM dbo.Drivers WHERE Id = ${driverId}`); 30 | } 31 | 32 | module.exports = { getDriverById }; 33 | -------------------------------------------------------------------------------- /challenges/challenge3/finished/coldstartapi/shared/user-utils.js: -------------------------------------------------------------------------------- 1 | const getUser = (req) => { 2 | const header = req.headers["x-ms-client-principal"]; 3 | if (header != undefined) { 4 | const encoded = Buffer.from(header, "base64"); 5 | const decoded = encoded.toString("ascii"); 6 | 7 | return JSON.parse(decoded); 8 | } else { 9 | return { userDetails: "John Doe" }; 10 | } 11 | }; 12 | 13 | module.exports = { getUser }; -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/ColdStartCustomerSWA.ComponentsLibrary.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | net5.0 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/LocalStorage.cs: -------------------------------------------------------------------------------- 1 | using Microsoft.JSInterop; 2 | using System.Threading.Tasks; 3 | 4 | namespace ColdStartBlazor.ComponentsLibrary 5 | { 6 | public static class LocalStorage 7 | { 8 | public static ValueTask GetAsync(IJSRuntime jsRuntime, string key) 9 | => jsRuntime.InvokeAsync("blazorLocalStorage.get", key); 10 | 11 | public static ValueTask SetAsync(IJSRuntime jsRuntime, string key, object value) 12 | => jsRuntime.InvokeVoidAsync("blazorLocalStorage.set", key, value); 13 | 14 | public static ValueTask DeleteAsync(IJSRuntime jsRuntime, string key) 15 | => jsRuntime.InvokeVoidAsync("blazorLocalStorage.delete", key); 16 | } 17 | } 18 | 19 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/Map/Map.razor: -------------------------------------------------------------------------------- 1 | @using Microsoft.JSInterop 2 | @inject IJSRuntime JSRuntime 3 | 4 |
5 | 6 | @code { 7 | string elementId = $"map-{Guid.NewGuid().ToString("D")}"; 8 | 9 | [Parameter] public double Zoom { get; set; } 10 | [Parameter] public List Markers { get; set; } 11 | 12 | protected async override Task OnAfterRenderAsync(bool firstRender) 13 | { 14 | await JSRuntime.InvokeVoidAsync( 15 | "deliveryMap.showOrUpdate", 16 | elementId, 17 | Markers); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/Map/Marker.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartCustomerSWA.ComponentsLibrary.Map 2 | { 3 | public class Marker 4 | { 5 | public string Description { get; set; } 6 | 7 | public double X { get; set; } 8 | 9 | public double Y { get; set; } 10 | 11 | public bool ShowPopup { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/Map/Point.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartCustomerSWA.ComponentsLibrary.Map 2 | { 3 | public class Point 4 | { 5 | public double X { get; set; } 6 | 7 | public double Y { get; set; } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/background.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/exampleJsInterop.js: -------------------------------------------------------------------------------- 1 | // This is a JavaScript module that is loaded on demand. It can export any number of 2 | // functions, and may import other JavaScript modules if required. 3 | 4 | export function showPrompt(message) { 5 | return prompt(message, 'Type anything here'); 6 | } 7 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/layers-2x.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/layers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/layers.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-icon-2x.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-icon.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/leaflet/images/marker-shadow.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomer.ComponentsLibrary/wwwroot/localStorage.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | window.blazorLocalStorage = { 3 | get: key => key in localStorage ? JSON.parse(localStorage[key]) : null, 4 | set: (key, value) => { localStorage[key] = JSON.stringify(value); }, 5 | delete: key => { delete localStorage[key]; } 6 | }; 7 | })(); 8 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA.Shared/ColdStartCustomerSWA.Shared.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | netstandard2.0 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA.Shared/Driver.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartCustomerSWA 2 | { 3 | public class Driver 4 | { 5 | public long? DriverId { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public string ImageUrl { get; set; } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA.Shared/IceCream.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartCustomerSWA 2 | { 3 | public class IceCream 4 | { 5 | public long Id { get; set; } 6 | 7 | public string Name { get; set; } 8 | 9 | public string Description { get; set; } 10 | 11 | public string ImageUrl { get; set; } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA.Shared/Order.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace ColdStartCustomerSWA 4 | { 5 | public class Order 6 | { 7 | public Guid Id { get; set; } 8 | 9 | public string User { get; set; } 10 | 11 | public DateTime Date { get; set; } 12 | 13 | public IceCream IceCream { get; set; } 14 | 15 | public string Status { get; set; } 16 | 17 | public Driver Driver { get; set; } 18 | 19 | public string FullAddress { get; set; } 20 | 21 | public string DeliveryPosition { get; set; } 22 | 23 | public string LastPosition { get; set; } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/App.razor: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |

Sorry, there's nothing at this address.

9 |
10 |
11 |
12 |
13 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/Pages/LoginProviders.razor: -------------------------------------------------------------------------------- 1 | @page "/login-providers" 2 | 3 | @{ 4 | var providers = new Dictionary 5 | { 6 | { "github", "GitHub" }, 7 | { "twitter", "Twitter" }, 8 | { "facebook", "Facebook" } 9 | }; 10 | } 11 | 12 |

Login

13 | 14 |
15 | @foreach (var provider in providers) 16 | { 17 | 24 | } 25 |
26 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/Program.cs: -------------------------------------------------------------------------------- 1 | using AzureStaticWebApps.Blazor.Authentication; 2 | using Microsoft.AspNetCore.Components.WebAssembly.Hosting; 3 | using Microsoft.Extensions.DependencyInjection; 4 | using System; 5 | using System.Net.Http; 6 | using System.Threading.Tasks; 7 | 8 | namespace ColdStartCustomerSWA 9 | { 10 | public class Program 11 | { 12 | public static async Task Main(string[] args) 13 | { 14 | var builder = WebAssemblyHostBuilder.CreateDefault(args); 15 | builder.RootComponents.Add("app"); 16 | 17 | builder.Services 18 | .AddTransient(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) }) 19 | .AddStaticWebAppsAuthentication(); 20 | 21 | builder.Services.AddScoped(); 22 | 23 | await builder.Build().RunAsync(); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/Properties/launchSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "iisSettings": { 3 | "windowsAuthentication": false, 4 | "anonymousAuthentication": true, 5 | "iisExpress": { 6 | "applicationUrl": "http://localhost:51678", 7 | "sslPort": 44373 8 | } 9 | }, 10 | "profiles": { 11 | "IIS Express": { 12 | "commandName": "IISExpress", 13 | "launchBrowser": true, 14 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 15 | "environmentVariables": { 16 | "ASPNETCORE_ENVIRONMENT": "Development" 17 | } 18 | }, 19 | "ColdStartCustomerSWA": { 20 | "commandName": "Project", 21 | "dotnetRunMessages": "true", 22 | "launchBrowser": true, 23 | "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", 24 | "applicationUrl": "https://localhost:5001;http://localhost:5000", 25 | "environmentVariables": { 26 | "ASPNETCORE_ENVIRONMENT": "Development" 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/Shared/LoginDisplay.razor: -------------------------------------------------------------------------------- 1 |  17 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/Shared/MainLayout.razor: -------------------------------------------------------------------------------- 1 | @inherits LayoutComponentBase 2 | 3 |
4 | 7 | 8 | 9 | 10 | 11 |
My Orders
12 |
13 |
14 |
15 | 16 | 17 |
18 | 19 |
20 | @Body 21 |
22 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/_Imports.razor: -------------------------------------------------------------------------------- 1 | @using System.Net.Http 2 | @using System.Net.Http.Json 3 | @using Microsoft.AspNetCore.Components.Forms 4 | @using Microsoft.AspNetCore.Components.Routing 5 | @using Microsoft.AspNetCore.Components.Web 6 | @using Microsoft.AspNetCore.Components.Web.Virtualization 7 | @using Microsoft.AspNetCore.Components.WebAssembly.Http 8 | @using Microsoft.AspNetCore.Components.WebAssembly.Authentication 9 | @using Microsoft.JSInterop 10 | @using ColdStartCustomerSWA 11 | @using ColdStartCustomerSWA.Shared 12 | @using ColdStartCustomerSWA.ComponentsLibrary 13 | @using ColdStartCustomerSWA.ComponentsLibrary.Map 14 | @using ColdStartComponents 15 | @using Microsoft.AspNetCore.Components.Authorization 16 | @using Microsoft.AspNetCore.Authorization 17 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/appsettings.Development.json: -------------------------------------------------------------------------------- 1 | { 2 | "StaticWebAppsAuthentication": { 3 | "AuthenticationDataUrl": "/sample-data/me.json" 4 | }, 5 | "ColdStartApiUrl": "https://coldstartapi.azurewebsites.net/api/" 6 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/appsettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "ColdStartApiUrl": "api/" 3 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-300.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-300.woff -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-300.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-300.woff2 -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-500.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-500.woff -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-500.woff2 -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-700.woff -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-700.woff2 -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-regular.woff -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/font/quicksand-v8-latin-regular.woff2 -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/ICON-LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 Waybury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.eot -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.otf -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/css/open-iconic/font/fonts/open-iconic.woff -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/img/logo.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/img/orders.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/img/orders.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ColdStartCustomerSWA", 3 | "short_name": "ColdStartCustomerSWA", 4 | "start_url": "./", 5 | "display": "standalone", 6 | "background_color": "#ffffff", 7 | "theme_color": "#03173d", 8 | "icons": [ 9 | { 10 | "src": "img/logo.png", 11 | "type": "image/png", 12 | "sizes": "512x512" 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/sample-data/me.json: -------------------------------------------------------------------------------- 1 | { 2 | "clientPrincipal": { 3 | "identityProvider": "github", 4 | "userId": "jane.doe", 5 | "userDetails": "Jane Doe", 6 | "userRoles": [ 7 | "anonymous", 8 | "authenticated" 9 | ] 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/ColdStartCustomerSWA/ColdStartCustomerSWA/wwwroot/service-worker.js: -------------------------------------------------------------------------------- 1 | self.addEventListener('install', async event => { 2 | console.log('Installing service worker...'); 3 | self.skipWaiting(); 4 | }); 5 | 6 | self.addEventListener('fetch', event => { 7 | // You can add custom logic here for controlling whether to use cached data if offline, etc. 8 | // The following line opts out, so requests go directly to the network as usual. 9 | return null; 10 | }); 11 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Assets/AboutAssets.txt: -------------------------------------------------------------------------------- 1 | Any raw assets you want to be deployed with your application can be placed in 2 | this directory (and child directories) and given a Build Action of "AndroidAsset". 3 | 4 | These files will be deployed with your package and will be accessible using Android's 5 | AssetManager, like this: 6 | 7 | public class ReadAsset : Activity 8 | { 9 | protected override void OnCreate (Bundle bundle) 10 | { 11 | base.OnCreate (bundle); 12 | 13 | InputStream input = Assets.Open ("my_asset.txt"); 14 | } 15 | } 16 | 17 | Additionally, some Android functions will automatically load asset files: 18 | 19 | Typeface tf = Typeface.CreateFromAsset (Context.Assets, "fonts/samplefont.ttf"); 20 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Properties/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/drawable/COLDSTART_LOGO_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/drawable/COLDSTART_LOGO_black.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/drawable/Truck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/drawable/Truck.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/layout/Tabbar.xml: -------------------------------------------------------------------------------- 1 | 2 | 12 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/layout/Toolbar.xml: -------------------------------------------------------------------------------- 1 | 9 | 10 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #33C5F3 4 | #95E0F9 5 | #0195C6 6 | #F66970 7 | 8 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.Android/Resources/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/App.xaml: -------------------------------------------------------------------------------- 1 |  6 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/LargeTile.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SmallTile.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/SplashScreen.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square150x150Logo.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-16.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-24.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-256.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-32.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-lightunplated_targetsize-48.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-16.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-24.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-256.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-32.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.altform-unplated_targetsize-48.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-16.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-24.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-256.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-32.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Square44x44Logo.targetsize-48.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.backup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.backup.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/StoreLogo.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-100.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-125.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-125.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-150.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-200.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-400.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Assets/Wide310x150Logo.scale-400.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/COLDSTART_LOGO_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/COLDSTART_LOGO_black.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/MainPage.xaml: -------------------------------------------------------------------------------- 1 |  7 | 8 | 9 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/MainPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | using System.Runtime.InteropServices.WindowsRuntime; 6 | using Windows.Foundation; 7 | using Windows.Foundation.Collections; 8 | using Windows.UI.Xaml; 9 | using Windows.UI.Xaml.Controls; 10 | using Windows.UI.Xaml.Controls.Primitives; 11 | using Windows.UI.Xaml.Data; 12 | using Windows.UI.Xaml.Input; 13 | using Windows.UI.Xaml.Media; 14 | using Windows.UI.Xaml.Navigation; 15 | using Xamarin.Essentials; 16 | 17 | namespace ColdStartChallenge.DriverApp.UWP 18 | { 19 | public sealed partial class MainPage 20 | { 21 | public MainPage() 22 | { 23 | this.InitializeComponent(); 24 | Platform.MapServiceToken = "RJHqIE53Onrqons5CNOx~FrDr3XhjDTyEXEjng-CRoA~Aj69MhNManYUKxo6QcwZ0wmXBtyva0zwuHB04rFYAPf7qqGJ5cHb03RCDw1jIW8l"; 25 | LoadApplication(new ColdStartChallenge.DriverApp.App()); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("ColdStartChallenge.DriverApp.UWP")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("ColdStartChallenge.DriverApp.UWP")] 13 | [assembly: AssemblyCopyright("Copyright © 2015")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Version information for an assembly consists of the following four values: 18 | // 19 | // Major Version 20 | // Minor Version 21 | // Build Number 22 | // Revision 23 | // 24 | // You can specify all the values or you can default the Build and Revision Numbers 25 | // by using the '*' as shown below: 26 | // [assembly: AssemblyVersion("1.0.*")] 27 | [assembly: AssemblyVersion("1.0.0.0")] 28 | [assembly: AssemblyFileVersion("1.0.0.0")] 29 | [assembly: ComVisible(false)] -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Truck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.UWP/Truck.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon1024.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon120.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon152.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon167.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon180.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon20.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon29.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon40.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon58.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon60.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon76.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon80.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Assets.xcassets/AppIcon.appiconset/Icon87.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Entitlements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | keychain-access-groups 6 | 7 | $(AppIdentifierPrefix)be.MADN.ColdStartChallenge.DriverApp 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Main.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | 5 | using Foundation; 6 | using UIKit; 7 | 8 | namespace ColdStartChallenge.DriverApp.iOS 9 | { 10 | public class Application 11 | { 12 | // This is the main entry point of the application. 13 | static void Main(string[] args) 14 | { 15 | // if you want to use a different Application Delegate class from "AppDelegate" 16 | // you can specify it here. 17 | UIApplication.Main(args, null, "AppDelegate"); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/COLDSTART_LOGO_black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/COLDSTART_LOGO_black.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-568h@2x.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-Portrait.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default-Portrait@2x.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Default@2x.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Truck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp.iOS/Resources/Truck.png -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/App.xaml: -------------------------------------------------------------------------------- 1 |  2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/App.xaml.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.Pages; 2 | using MonkeyCache.FileStore; 3 | using Xamarin.Forms; 4 | 5 | namespace ColdStartChallenge.DriverApp 6 | { 7 | public partial class App : Application 8 | { 9 | public App() 10 | { 11 | InitializeComponent(); 12 | 13 | Barrel.ApplicationId = "ColdStartChallenge.DriverApp"; 14 | 15 | MainPage = new NavigationPage(new LoginPage()); 16 | } 17 | 18 | protected override void OnStart() 19 | { 20 | } 21 | 22 | protected override void OnSleep() 23 | { 24 | } 25 | 26 | protected override void OnResume() 27 | { 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/AppData.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.Models; 2 | 3 | namespace ColdStartChallenge.DriverApp 4 | { 5 | public sealed class AppData 6 | { 7 | static AppData() 8 | { 9 | } 10 | 11 | private AppData() 12 | { 13 | } 14 | 15 | public static AppData Instance { get; } = new AppData(); 16 | 17 | public Driver User { get; set; } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | using Xamarin.Forms.Xaml; 3 | 4 | [assembly: XamlCompilation(XamlCompilationOptions.Compile)] 5 | [assembly: ExportFont("materialdesignicons-webfont.ttf", Alias = "mdifont")] -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Controls/LoadingView.xaml: -------------------------------------------------------------------------------- 1 |  2 | 9 | 10 | 11 | 12 | 13 | 14 | 19 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Converters/SelectedSortOptionToColorConverter.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.Models; 2 | using System; 3 | using System.Globalization; 4 | using Xamarin.Forms; 5 | 6 | namespace ColdStartChallenge.DriverApp.Converters 7 | { 8 | public class SelectedSortOptionToColorConverter : IValueConverter 9 | { 10 | public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 11 | { 12 | if(value is SortOption selectedSo && parameter is SortOption so) 13 | { 14 | if (selectedSo == so) 15 | { 16 | return (Color)Application.Current.Resources["ColorPrimaryDark"]; 17 | } 18 | } 19 | return (Color)Application.Current.Resources["ColorPrimary"]; 20 | } 21 | 22 | public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 23 | { 24 | throw new NotImplementedException(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/CacheKeys.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace ColdStartChallenge.DriverApp.Models 4 | { 5 | public static class CacheKeys 6 | { 7 | public static string Drivers = "Drivers"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/Constants.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace ColdStartChallenge.DriverApp.Models 4 | { 5 | public static class Constants 6 | { 7 | public const string BASE_URI = "https://*** ENTER THE URL OF YOUR HOSTED API ***/api/"; 8 | } 9 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/Driver.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace ColdStartChallenge.DriverApp.Models 5 | { 6 | //public class Driver 7 | //{ 8 | // public int Id { get; set; } 9 | // public string Name { get; set; } 10 | //} 11 | 12 | public class Driver 13 | { 14 | [JsonProperty("driverId")] 15 | public int? DriverId { get; set; } 16 | 17 | [JsonProperty("name")] 18 | public string Name { get; set; } 19 | 20 | [JsonProperty("imageUrl")] 21 | public Uri ImageUrl { get; set; } 22 | } 23 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/Enum.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace ColdStartChallenge.DriverApp.Models 4 | { 5 | /// 6 | /// Now you can use Generics to have cleaner code when enum parsing! 7 | /// 8 | /// 9 | /// 10 | /// CT.Organ organNewParse = Enum.Parse("LENS"); 11 | /// 12 | public static class Enum 13 | { 14 | public static T Parse(string value, bool ignoreCase = true) 15 | { 16 | return (T)Enum.Parse(typeof(T), value, ignoreCase); 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/Icecream.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Newtonsoft.Json; 3 | 4 | namespace ColdStartChallenge.DriverApp.Models 5 | { 6 | public partial class Icecream 7 | { 8 | [JsonProperty("icecreamId")] 9 | public int IcecreamId { get; set; } 10 | 11 | [JsonProperty("name")] 12 | public string Name { get; set; } 13 | 14 | [JsonProperty("description")] 15 | public string Description { get; set; } 16 | 17 | [JsonProperty("imageUrl")] 18 | public Uri ImageUrl { get; set; } 19 | } 20 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/Location.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartChallenge.DriverApp.Models 2 | { 3 | public class Location 4 | { 5 | public double Longitude { get; set; } 6 | public double Latitude { get; set; } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/OrderStatus.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartChallenge.DriverApp.Models 2 | { 3 | public enum OrderStatus 4 | { 5 | New, 6 | Ready, 7 | Delivering, 8 | Completed 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Models/SortOption.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartChallenge.DriverApp.Models 2 | { 3 | public enum SortOption 4 | { 5 | Recency, 6 | Distance 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Navigation/NavigationMode.cs: -------------------------------------------------------------------------------- 1 | namespace ColdStartChallenge.DriverApp.Navigation 2 | { 3 | public enum NavigationMode 4 | { 5 | New, 6 | Back 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Pages/DashboardPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.ViewModels; 2 | using Xamarin.Forms; 3 | using Xamarin.Forms.Xaml; 4 | 5 | namespace ColdStartChallenge.DriverApp.Pages 6 | { 7 | [XamlCompilation(XamlCompilationOptions.Compile)] 8 | public partial class DashboardPage : ContentPage 9 | { 10 | public DashboardPage() 11 | { 12 | InitializeComponent(); 13 | BindingContext = new DashboardPageViewModel(Navigation); 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Pages/DeliveryDetailPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using ColdStartChallenge.DriverApp.Models; 3 | using ColdStartChallenge.DriverApp.ViewModels; 4 | using Xamarin.Forms; 5 | using Xamarin.Forms.Xaml; 6 | 7 | namespace ColdStartChallenge.DriverApp.Pages 8 | { 9 | [XamlCompilation(XamlCompilationOptions.Compile)] 10 | public partial class DeliveryDetailPage : ContentPage 11 | { 12 | public DeliveryDetailPage(Guid orderId, OrderStatus orderStatus = OrderStatus.Ready) 13 | { 14 | InitializeComponent(); 15 | BindingContext = new DeliveryDetailPageViewModel(Navigation, orderId, orderStatus); 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Pages/LoginPage.xaml.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.ViewModels; 2 | using Xamarin.Forms; 3 | using Xamarin.Forms.Xaml; 4 | 5 | namespace ColdStartChallenge.DriverApp.Pages 6 | { 7 | [XamlCompilation(XamlCompilationOptions.Compile)] 8 | public partial class LoginPage : ContentPage 9 | { 10 | public LoginPage() 11 | { 12 | InitializeComponent(); 13 | BindingContext = new LoginPageViewModel(Navigation); 14 | } 15 | 16 | //protected override void OnDisappearing() 17 | //{ 18 | // if(Navigation.NavigationStack.Last() != this) 19 | // Navigation.RemovePage(this); 20 | 21 | // base.OnDisappearing(); 22 | //} 23 | } 24 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Resources/Fonts/materialdesignicons-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ColdStart-Challenge/ColdStart-Challenge-2021/96d66db71307cb4714c8f4626366abb76f2ba1c0/challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Resources/Fonts/materialdesignicons-webfont.ttf -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Resources/Styles.xaml.cs: -------------------------------------------------------------------------------- 1 | using Xamarin.Forms; 2 | 3 | namespace ColdStartChallenge.DriverApp.Resources 4 | { 5 | public partial class Styles : ResourceDictionary 6 | { 7 | public Styles() 8 | { 9 | InitializeComponent(); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Services/CredentialsService.cs: -------------------------------------------------------------------------------- 1 | using System.Threading.Tasks; 2 | using Xamarin.Essentials; 3 | 4 | namespace ColdStartChallenge.DriverApp.Services 5 | { 6 | public class CredentialsService 7 | { 8 | private const string UsernameKey = "username"; 9 | private const string PasswordKey = "password"; 10 | 11 | public Task StoreCredentials(string username, string passwd) 12 | { 13 | return Task.WhenAll( 14 | SecureStorage.SetAsync(UsernameKey, username), 15 | SecureStorage.SetAsync(PasswordKey, passwd) 16 | ); 17 | } 18 | 19 | public async Task<(string username, string password)> GetCredentials() 20 | { 21 | var usernameTask = SecureStorage.GetAsync(UsernameKey); 22 | var passwordTask = SecureStorage.GetAsync(PasswordKey); 23 | 24 | await Task.WhenAll(usernameTask, passwordTask); 25 | 26 | return (usernameTask.Result, passwordTask.Result); 27 | } 28 | 29 | public void Purge() 30 | { 31 | SecureStorage.Remove(UsernameKey); 32 | SecureStorage.Remove(PasswordKey); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/Services/LoginService.cs: -------------------------------------------------------------------------------- 1 | using ColdStartChallenge.DriverApp.Models; 2 | using System.Threading.Tasks; 3 | 4 | namespace ColdStartChallenge.DriverApp.Services 5 | { 6 | public class LoginService 7 | { 8 | public async Task Login(string username, string password) 9 | { 10 | //Dummy implementation, due to no actual authentication on backend 11 | await Task.Delay(1000); 12 | 13 | if( username == "MADN") 14 | { 15 | return new Driver 16 | { 17 | DriverId = 1, 18 | Name = "Mike" 19 | }; 20 | } 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/DriverApp/ColdStartChallenge.DriverApp/ColdStartChallenge.DriverApp/ViewModels/BindableBase.cs: -------------------------------------------------------------------------------- 1 | using System.ComponentModel; 2 | using System.Runtime.CompilerServices; 3 | 4 | namespace ColdStartChallenge.DriverApp.ViewModels 5 | { 6 | public class BindableBase : INotifyPropertyChanged 7 | { 8 | protected void RaisePropertyChanged([CallerMemberName] string property = null) 9 | => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(property)); 10 | 11 | public event PropertyChangedEventHandler PropertyChanged; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/.funcignore: -------------------------------------------------------------------------------- 1 | *.js.map 2 | *.ts 3 | .git* 4 | .vscode 5 | local.settings.json 6 | test 7 | tsconfig.json -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "ms-azuretools.vscode-azurefunctions" 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Attach to Node Functions", 6 | "type": "node", 7 | "request": "attach", 8 | "port": 9229, 9 | "preLaunchTask": "func: host start" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "azureFunctions.deploySubpath": ".", 3 | "azureFunctions.postDeployTask": "npm install", 4 | "azureFunctions.projectLanguage": "JavaScript", 5 | "azureFunctions.projectRuntime": "~3", 6 | "debug.internalConsoleOptions": "neverOpen", 7 | "azureFunctions.preDeployTask": "npm prune" 8 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "func", 6 | "command": "host start", 7 | "problemMatcher": "$func-node-watch", 8 | "isBackground": true, 9 | "dependsOn": "npm install" 10 | }, 11 | { 12 | "type": "shell", 13 | "label": "npm install", 14 | "command": "npm install" 15 | }, 16 | { 17 | "type": "shell", 18 | "label": "npm prune", 19 | "command": "npm prune --production", 20 | "problemMatcher": [] 21 | } 22 | ] 23 | } -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/host.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0", 3 | "logging": { 4 | "applicationInsights": { 5 | "samplingSettings": { 6 | "isEnabled": true, 7 | "excludedTypes": "Request" 8 | } 9 | } 10 | }, 11 | "extensionBundle": { 12 | "id": "Microsoft.Azure.Functions.ExtensionBundle", 13 | "version": "[1.*, 2.0.0)" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/myorders-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "my-orders" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/myorders-get/index.js: -------------------------------------------------------------------------------- 1 | const { getUser } = require('../shared/user-utils'); 2 | const data = require('../shared/order-cosmos-data'); 3 | 4 | module.exports = async function (context, req) { 5 | try { 6 | // Get the user information from the header, as specified in SWA 7 | const user = getUser(req); 8 | 9 | // Get the user's orders, regardless of status 10 | console.log(`User info: ${user}`); 11 | let items = await data.getMyOrders(user.userDetails); 12 | 13 | // Remove Cosmos DB technical fields when returning results 14 | items = data.removeTechnicalAttributes(items); 15 | context.res.status(200).json(items); 16 | } catch (error) { 17 | context.res.status(500).send(error); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-get/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["get"], 9 | "route": "orders" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-get/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/order-cosmos-data'); 2 | 3 | module.exports = async function (context, req) { 4 | try { 5 | // Get the status filter from the query string 6 | let status = req.query.status; 7 | if (!status) { 8 | status = 'Ready'; 9 | } 10 | 11 | // Get the orders for the given state 12 | let items = await data.getOrdersByStatus(status); 13 | 14 | // Remove Cosmos DB technical fields when returning results 15 | items = data.removeTechnicalAttributes(items); 16 | context.res.status(200).json(items); 17 | } catch (error) { 18 | context.res.status(500).send(error); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-put/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "authLevel": "anonymous", 5 | "type": "httpTrigger", 6 | "direction": "in", 7 | "name": "req", 8 | "methods": ["put"], 9 | "route": "orders/{Id}" 10 | }, 11 | { 12 | "type": "http", 13 | "direction": "out", 14 | "name": "res" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-queued/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "name": "myQueueItem", 5 | "type": "queueTrigger", 6 | "direction": "in", 7 | "queueName": "customer-orders", 8 | "connection": "coldstartsa_STORAGE" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-timer/function.json: -------------------------------------------------------------------------------- 1 | { 2 | "bindings": [ 3 | { 4 | "name": "myTimer", 5 | "type": "timerTrigger", 6 | "direction": "in", 7 | "schedule": "0 */5 * * * *" 8 | } 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/orders-timer/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../shared/order-cosmos-data'); 2 | 3 | /* This function will 'process' all accepted customer orders and send them to the production line. 4 | After processing, the orders will be updated to the 'Ready' state. 5 | The function will be triggered by a timer. 6 | */ 7 | module.exports = async function (context, myTimer) { 8 | var timeStamp = new Date().toISOString(); 9 | 10 | if (myTimer.isPastDue) { 11 | context.log('JavaScript is running late!'); 12 | } 13 | 14 | // Process all accepted customer orders - for sake of demonstration purposes just update their status 15 | await data.produceOrders(); 16 | 17 | context.log('JavaScript timer trigger function ran!', timeStamp); 18 | }; -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "coldstartapi", 3 | "version": "1.0.0", 4 | "description": "", 5 | "scripts": { 6 | "start": "func start", 7 | "test": "echo \"No tests yet...\"" 8 | }, 9 | "dependencies": { 10 | "@azure/cosmos": "^3.9.5", 11 | "tedious": "^11.0.3" 12 | }, 13 | "devDependencies": {} 14 | } 15 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/proxies.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json.schemastore.org/proxies", 3 | "proxies": {} 4 | } 5 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/shared/catalog-data.js: -------------------------------------------------------------------------------- 1 | const { config } = require("./config"); 2 | const { queryDatabase } = require("../shared/sql-utils"); 3 | 4 | /** 5 | * Get all catalog items 6 | * @returns collection of catalog items 7 | */ 8 | async function getCatalog() { 9 | console.log('using database '); 10 | return await queryDatabase(`SELECT * FROM dbo.Icecreams`) 11 | } 12 | 13 | /** 14 | * Get a catalog item by id 15 | * @param {integer} itemId 16 | * @returns 17 | */ 18 | async function getCatalogItemById(itemId) { 19 | console.log('using database '); 20 | return await queryDatabase(`SELECT * FROM dbo.Icecreams WHERE Id = ${itemId}`); 21 | } 22 | 23 | module.exports = { getCatalog, getCatalogItemById }; 24 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/shared/config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | const process = require("process"); 3 | 4 | const config = { 5 | azure_storage_connectionstring: process.env.AZURE_STORAGE_CONNECTIONSTRING 6 | }; 7 | 8 | // Create connection to database 9 | const sqlConfig = { 10 | authentication: { 11 | options: { 12 | userName: process.env.SQL_USERNAME, 13 | password: process.env.SQL_PASSWORD, 14 | }, 15 | type: "default" 16 | }, 17 | server: process.env.SQL_SERVERNAME, 18 | options: { 19 | database: "coldstartsql", 20 | encrypt: true 21 | } 22 | }; 23 | 24 | const cosmosConfig = { 25 | cosmosdb_endpoint: process.env.COSMOSDB_ENDPOINT, 26 | cosmosdb_key: process.env.COSMOSDB_KEY, 27 | cosmosdb_databaseId: "coldstartdb", 28 | cosmosdb_ordersContainerId: "customerorders", 29 | cosmosdb_ordersPartitionKey: "id", 30 | }; 31 | 32 | module.exports = { config, sqlConfig, cosmosConfig }; 33 | -------------------------------------------------------------------------------- /challenges/challenge4/starter/coldstartapi/shared/user-utils.js: -------------------------------------------------------------------------------- 1 | const getUser = (req) => { 2 | const header = req.headers["x-ms-client-principal"]; 3 | if (header != undefined) { 4 | const encoded = Buffer.from(header, "base64"); 5 | const decoded = encoded.toString("ascii"); 6 | 7 | return JSON.parse(decoded); 8 | } else { 9 | return { userDetails: "John Doe" }; 10 | } 11 | }; 12 | 13 | module.exports = { getUser }; --------------------------------------------------------------------------------