From 5d3071708447340695bde6d041457221aacbb083 Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Thu, 13 Apr 2023 09:20:00 -0700 Subject: [PATCH] Add LambdaTriggersSample --- .../2023/LambdaTriggersSample/.editorconfig | 128 ++++++ .../2023/LambdaTriggersSample/.gitattributes | 70 +++ .../2023/LambdaTriggersSample/.gitignore | 265 ++++++++++++ .../Directory.Build.props | 37 ++ .../2023/LambdaTriggersSample/LICENSE | 21 + .../AssemblyInfo.cs | 1 + .../LambdaTriggers.Backend.Common.csproj | 22 + .../S3Service.cs | 80 ++++ .../LambdaTriggers.Common/Constants.cs | 9 + .../LambdaTriggers.Common.csproj | 9 + .../GenerateThumbnail.cs | 78 ++++ .../LambdaTriggers.GenerateThumbnail.csproj | 36 ++ .../Properties/launchSettings.json | 10 + .../aws-lambda-tools-defaults.json | 28 ++ .../GetThumbnail.cs | 59 +++ .../LambdaTriggers.GetThumbnail.csproj | 33 ++ .../Properties/launchSettings.json | 10 + .../aws-lambda-tools-defaults.json | 27 ++ .../LambdaTriggers.Mobile/App.cs | 9 + .../LambdaTriggers.Mobile/AppShell.cs | 9 + .../LambdaTriggers.Mobile/GlobalUsings.cs | 2 + .../LambdaTriggers.Mobile.csproj | 65 +++ .../LambdaTriggers.Mobile/MauiProgram.cs | 41 ++ .../Pages/Base/BaseContentPage.cs | 14 + .../LambdaTriggers.Mobile/Pages/PhotoPage.cs | 100 +++++ .../Platforms/Android/AndroidManifest.xml | 15 + .../Platforms/Android/MainActivity.cs | 10 + .../Platforms/Android/MainApplication.cs | 15 + .../Android/Resources/values/colors.xml | 6 + .../Platforms/MacCatalyst/AppDelegate.cs | 8 + .../Platforms/MacCatalyst/Info.plist | 35 ++ .../Platforms/MacCatalyst/Program.cs | 14 + .../Platforms/Windows/App.xaml | 8 + .../Platforms/Windows/App.xaml.cs | 23 + .../Platforms/Windows/Package.appxmanifest | 46 ++ .../Platforms/Windows/app.manifest | 15 + .../Platforms/iOS/AppDelegate.cs | 8 + .../Platforms/iOS/Info.plist | 37 ++ .../Platforms/iOS/Program.cs | 14 + .../Properties/launchSettings.json | 8 + .../Resources/AppIcon/appicon.svg | 4 + .../Resources/AppIcon/appiconfg.svg | 8 + .../Resources/Fonts/OpenSans-Regular.ttf | Bin 0 -> 107184 bytes .../Resources/Fonts/OpenSans-Semibold.ttf | Bin 0 -> 111068 bytes .../Resources/Images/dotnet_bot.svg | 93 ++++ .../Resources/Raw/AboutAssets.txt | 15 + .../Resources/Splash/splash.svg | 8 + .../Resources/Styles/Colors.xaml | 44 ++ .../Resources/Styles/Styles.xaml | 405 ++++++++++++++++++ .../Services/IGetThumbnailApi.cs | 11 + .../Services/IUploadPhotosApi.cs | 11 + .../Services/PhotosApiService.cs | 20 + .../ViewModels/Base/BaseViewModel.cs | 5 + .../ViewModels/PhotoViewModel.cs | 97 +++++ .../LambdaTriggers.UploadImage.csproj | 36 ++ .../Properties/launchSettings.json | 10 + .../LambdaTriggers.UploadImage/UploadImage.cs | 63 +++ .../aws-lambda-tools-defaults.json | 28 ++ .../LambdaTriggersSample/LambdaTriggers.sln | 71 +++ .../2023/LambdaTriggersSample/README.md | 13 + 60 files changed, 2367 insertions(+) create mode 100644 SampleApplications/2023/LambdaTriggersSample/.editorconfig create mode 100644 SampleApplications/2023/LambdaTriggersSample/.gitattributes create mode 100644 SampleApplications/2023/LambdaTriggersSample/.gitignore create mode 100644 SampleApplications/2023/LambdaTriggersSample/Directory.Build.props create mode 100644 SampleApplications/2023/LambdaTriggersSample/LICENSE create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/AssemblyInfo.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/LambdaTriggers.Backend.Common.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/S3Service.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/Constants.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/LambdaTriggers.Common.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/GenerateThumbnail.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/LambdaTriggers.GenerateThumbnail.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/Properties/launchSettings.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/aws-lambda-tools-defaults.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/GetThumbnail.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/LambdaTriggers.GetThumbnail.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/Properties/launchSettings.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/aws-lambda-tools-defaults.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/App.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/AppShell.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/GlobalUsings.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/LambdaTriggers.Mobile.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/MauiProgram.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/Base/BaseContentPage.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/PhotoPage.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/AndroidManifest.xml create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainActivity.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainApplication.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/Resources/values/colors.xml create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/AppDelegate.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Info.plist create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Program.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/Package.appxmanifest create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/app.manifest create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/AppDelegate.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Info.plist create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Program.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Properties/launchSettings.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appicon.svg create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appiconfg.svg create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Regular.ttf create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Semibold.ttf create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Images/dotnet_bot.svg create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Raw/AboutAssets.txt create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Splash/splash.svg create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Colors.xaml create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Styles.xaml create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IGetThumbnailApi.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IUploadPhotosApi.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/PhotosApiService.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/Base/BaseViewModel.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/PhotoViewModel.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/LambdaTriggers.UploadImage.csproj create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/Properties/launchSettings.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/UploadImage.cs create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/aws-lambda-tools-defaults.json create mode 100644 SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.sln create mode 100644 SampleApplications/2023/LambdaTriggersSample/README.md diff --git a/SampleApplications/2023/LambdaTriggersSample/.editorconfig b/SampleApplications/2023/LambdaTriggersSample/.editorconfig new file mode 100644 index 0000000..e23bfb8 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/.editorconfig @@ -0,0 +1,128 @@ +# Suppress: EC112 +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = false +indent_style = space +indent_size = 4 + +# Code files +[*.{cs,csx,vb,vbx}] +indent_style = tab +indent_size = 4 + +# Code files +[*.sln] +indent_size = 4 + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj}] +indent_size = 2 + +# Xml config files +[*.{props,targets,ruleset,config,nuspec,resx,vsixmanifest,vsct}] +indent_size = 2 + +# JSON files +[*.json] +indent_size = 2 + +# XML files +[*.xml] +indent_size = 2 + +[*.cs] + +# Organize usings +dotnet_sort_system_directives_first = true + +# IDE0160: Use file scoped namespace +csharp_style_namespace_declarations = file_scoped:error + +# CS4014: Because this call is not awaited, execution of the current method continues before the call is completed +dotnet_diagnostic.CS4014.severity = error + +# Remove explicit default access modifiers +dotnet_style_require_accessibility_modifiers = omit_if_default:error + +# CA1063: Implement IDisposable Correctly +dotnet_diagnostic.CA1063.severity = error + +# CA1001: Type owns disposable field(s) but is not disposable +dotnet_diagnostic.CA1001.severity = error + +# Pattern matching +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method=true:suggestion + +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestions + +# Naming rules + +dotnet_diagnostic.IDE1006.severity = error + +## Public Fields are kept Pascal Case +dotnet_naming_symbols.public_symbols.applicable_kinds = field +dotnet_naming_symbols.public_symbols.applicable_accessibilities = public, internal + +dotnet_naming_style.first_word_upper_case_style.capitalization = first_word_upper + +dotnet_naming_rule.public_members_must_be_capitalized.symbols = public_symbols +dotnet_naming_rule.public_members_must_be_capitalized.style = first_word_upper_case_style +dotnet_naming_rule.public_members_must_be_capitalized.severity = suggestion + +## Instance fields are camelCase +dotnet_naming_rule.instance_fields_should_be_camel_case.severity = error +dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields +dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style + +dotnet_naming_symbols.instance_fields.applicable_kinds = field + +dotnet_naming_style.instance_field_style.capitalization = camel_case +dotnet_naming_style.instance_field_style.required_prefix = _ + +## Static fields are camelCase +dotnet_naming_rule.static_fields_should_be_camel_case.severity = error +dotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields +dotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style + +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, protected, protected_internal, private_protected + +dotnet_naming_style.static_field_style.capitalization = camel_case +dotnet_naming_style.static_field_style.required_prefix = _ + +# Modifier preferences +csharp_prefer_static_local_function = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:error + +# CA1822: Member does not access instance data and can be marked as static +dotnet_diagnostic.CA1822.severity = suggestion + +# CA1050: Declare types in namespaces +dotnet_diagnostic.CA1050.severity = error + +# CA2016: Forward the 'cancellationToken' parameter methods that take one +dotnet_diagnostic.CA2016.severity = error + +# CA2208: Method passes parameter as the paramName argument to a ArgumentNullException constructor. Replace this argument with one of the method's parameter names. Note that the provided parameter name should have the exact casing as declared on the method. +dotnet_diagnostic.CA2208.severity = error + +# CA1834: Use 'StringBuilder.Append(char)' instead of 'StringBuilder.Append(string)' when the input is a constant unit string +dotnet_diagnostic.CA1834.severity = error + +# IDE0220: Add explicit cast +dotnet_diagnostic.IDE0220.severity = error \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/.gitattributes b/SampleApplications/2023/LambdaTriggersSample/.gitattributes new file mode 100644 index 0000000..3a4406b --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/.gitattributes @@ -0,0 +1,70 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain + +# Force bash scripts to always use lf line endings so that if a repo is accessed +# in Unix via a file share from Windows, the scripts will work. +*.sh text eol=lf + +# Force the docs to always use lf line endings +docs/**/*.xml text eol=lf \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/.gitignore b/SampleApplications/2023/LambdaTriggersSample/.gitignore new file mode 100644 index 0000000..4740b3f --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/.gitignore @@ -0,0 +1,265 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# ignore Xamarin.Android Resource.Designer.cs files +**/*.Droid/**/[Rr]esource.[Dd]esigner.cs +**/*.Android/**/[Rr]esource.[Dd]esigner.cs +**/Android/**/[Rr]esource.[Dd]esigner.cs +**/Droid/**/[Rr]esource.[Dd]esigner.cs + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignoreable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml +**/.DS_Store + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Visual Studio Code +.vscode diff --git a/SampleApplications/2023/LambdaTriggersSample/Directory.Build.props b/SampleApplications/2023/LambdaTriggersSample/Directory.Build.props new file mode 100644 index 0000000..fb8cf89 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/Directory.Build.props @@ -0,0 +1,37 @@ + + + + + false + + latest + enable + enable + NETSDK1023 + True + false + true + + + + + + + + + + + + + + + nullable,CS1570,CS1571,CS1572,CS1573,CS1574,CS1580,CS1581,CS1584,CS1589,CS1590,CS1592,CS1598,CS1658,CS1734 + + + + + + + true + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LICENSE b/SampleApplications/2023/LambdaTriggersSample/LICENSE new file mode 100644 index 0000000..8d780b5 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Brandon Minnick + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/AssemblyInfo.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/AssemblyInfo.cs new file mode 100644 index 0000000..981ae29 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/AssemblyInfo.cs @@ -0,0 +1 @@ +[assembly: Amazon.Lambda.Core.LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/LambdaTriggers.Backend.Common.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/LambdaTriggers.Backend.Common.csproj new file mode 100644 index 0000000..22c1872 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/LambdaTriggers.Backend.Common.csproj @@ -0,0 +1,22 @@ + + + + net7.0 + enable + enable + + + + + + + + + + + + + + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/S3Service.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/S3Service.cs new file mode 100644 index 0000000..326eb70 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Backend.Common/S3Service.cs @@ -0,0 +1,80 @@ +using System.Net; +using System.Text.Json; +using Amazon.Lambda.Core; +using Amazon.S3; +using Amazon.S3.Model; +using LambdaTriggers.Common; + +namespace LambdaTriggers.Backend.Common; + +public static class S3Service +{ + public const string BucketName = "lambdatriggersbucket"; + + public static async Task UploadContentToS3(IAmazonS3 s3Client, string bucket, string key, T content, ILambdaLogger logger) + { + var request = content switch + { + Stream stream => new PutObjectRequest + { + InputStream = stream, + BucketName = bucket, + Key = key + }, + _ => new PutObjectRequest + { + ContentType = "application/json", + ContentBody = JsonSerializer.Serialize(content), + BucketName = bucket, + Key = key + } + }; + + logger.LogInformation($"Uploading object to S3..."); + + var putObjectResponse = await s3Client.PutObjectAsync(request).ConfigureAwait(false); + var fileUrl = s3Client.GeneratePreSignedURL(bucket, key, DateTime.UtcNow.AddYears(1), null); + + if (putObjectResponse.HttpStatusCode is not HttpStatusCode.OK) + throw new HttpRequestException($"{nameof(IAmazonS3.PutObjectAsync)} Failed: {putObjectResponse.HttpStatusCode}"); + + logger.LogInformation($"Upload suceeded"); + logger.LogInformation($"{nameof(putObjectResponse.ChecksumSHA256)}: {putObjectResponse.ChecksumSHA256}"); + + return new Uri(fileUrl); + } + + public static string GenerateThumbnailFilename(in string fileName) => Path.GetFileNameWithoutExtension(fileName) + Constants.ThumbnailSuffix; + + public static async Task GetFileUri(IAmazonS3 s3Client, string bucket, string key, ILambdaLogger lambdaLogger, DateTime? expirationDate = default) + { + expirationDate ??= DateTime.UtcNow.AddYears(1); + + lambdaLogger.LogInformation("Creating Presigned URL..."); + + + var doesFileExist = await DoesFileExist(bucket, key, s3Client, lambdaLogger).ConfigureAwait(false); + if (!doesFileExist) + return null; + + var url = s3Client.GeneratePreSignedURL(bucket, key, expirationDate.Value, null); + + lambdaLogger.LogInformation($"Presigned URL Expiring on {expirationDate:MMMM dd, yyyy} Generated: {url}"); + + return new Uri(url); + } + + static async Task DoesFileExist(string bucket, string key, IAmazonS3 s3Client, ILambdaLogger lambdaLogger) + { + try + { + var response = await s3Client.GetObjectAsync(bucket, key).ConfigureAwait(false); + return response is not null; + } + catch (AmazonS3Exception e) + { + lambdaLogger.LogError(e.Message); + return false; + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/Constants.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/Constants.cs new file mode 100644 index 0000000..209a1b9 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/Constants.cs @@ -0,0 +1,9 @@ +namespace LambdaTriggers.Common; + +public static class Constants +{ + public const string ImageFileNameQueryParameter = "filename"; + public const string UploadPhotoApiUrl = "https://322uo0ruod.execute-api.us-west-1.amazonaws.com/default"; + public const string GetThumbnailApiUrl = "https://1jk3r5j44h.execute-api.us-west-1.amazonaws.com/default"; + public const string ThumbnailSuffix = "_thumbnail.png"; +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/LambdaTriggers.Common.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/LambdaTriggers.Common.csproj new file mode 100644 index 0000000..cfadb03 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Common/LambdaTriggers.Common.csproj @@ -0,0 +1,9 @@ + + + + net7.0 + enable + enable + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/GenerateThumbnail.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/GenerateThumbnail.cs new file mode 100644 index 0000000..bffc63e --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/GenerateThumbnail.cs @@ -0,0 +1,78 @@ +using System.Net; +using Amazon.Lambda.Core; +using Amazon.Lambda.RuntimeSupport; +using Amazon.Lambda.S3Events; +using Amazon.Lambda.Serialization.SystemTextJson; +using Amazon.S3; +using LambdaTriggers.Backend.Common; +using LambdaTriggers.Common; +using SixLabors.ImageSharp; +using SixLabors.ImageSharp.Processing; + +namespace LambdaTriggers.GenerateThumbnail; + +public sealed class GenerateThumbnail : IDisposable +{ + static readonly IAmazonS3 _s3Client = new AmazonS3Client(); + + public static async Task FunctionHandler(S3Event evnt, ILambdaContext context) + { + var s3Event = evnt.Records?[0].S3; + if (s3Event is null || s3Event.Object.Key.EndsWith(Constants.ThumbnailSuffix)) + return; + + try + { + using var response = await _s3Client.GetObjectAsync(s3Event.Bucket.Name, s3Event.Object.Key); + if (response.HttpStatusCode is not HttpStatusCode.OK) + throw new InvalidOperationException("Failed to get S3 file"); + + using var imageMemoryStream = new MemoryStream(); + + await response.ResponseStream.CopyToAsync(imageMemoryStream).ConfigureAwait(false); + if (imageMemoryStream is null || imageMemoryStream.ToArray().Length < 1) + throw new InvalidOperationException($"The document '{s3Event.Object.Key}' is invalid"); + + using var thumbnail = await GetPNGThumbnail(imageMemoryStream).ConfigureAwait(false); + + var thumbnailName = S3Service.GenerateThumbnailFilename(s3Event.Object.Key); + + await S3Service.UploadContentToS3(_s3Client, s3Event.Bucket.Name, thumbnailName, thumbnail, context.Logger).ConfigureAwait(false); + } + catch (Exception e) + { + context.Logger.LogInformation($"Error creating thumbail for {s3Event.Object.Key} from bucket {s3Event.Bucket.Name}."); + context.Logger.LogInformation(e.ToString()); + throw; + } + } + + public void Dispose() + { + _s3Client.Dispose(); + } + + static async Task GetPNGThumbnail(Stream imageStream) + { + var resizeOptions = new ResizeOptions + { + Mode = ResizeMode.Max, + Size = new Size(200, 200) + }; + + imageStream.Position = 0; + using var image = await Image.LoadAsync(imageStream).ConfigureAwait(false); + + image.Mutate(imageContext => imageContext.Resize(resizeOptions)); + + var outputMemoryStream = new MemoryStream(); + await image.SaveAsPngAsync(outputMemoryStream).ConfigureAwait(false); + + return outputMemoryStream; + } + + static Task Main(string[] args) => + LambdaBootstrapBuilder.Create((S3Event s3Event, ILambdaContext context) => FunctionHandler(s3Event, context), new DefaultLambdaJsonSerializer()) + .Build() + .RunAsync(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/LambdaTriggers.GenerateThumbnail.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/LambdaTriggers.GenerateThumbnail.csproj new file mode 100644 index 0000000..73077d4 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/LambdaTriggers.GenerateThumbnail.csproj @@ -0,0 +1,36 @@ + + + + Exe + net7.0 + enable + Lambda + bootstrap + + true + + + true + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/Properties/launchSettings.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/Properties/launchSettings.json new file mode 100644 index 0000000..5870340 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Mock Lambda Test Tool": { + "commandName": "Executable", + "commandLineArgs": "--port 5050", + "workingDirectory": ".\\bin\\$(Configuration)\\net7.0", + "executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-7.0.exe" + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/aws-lambda-tools-defaults.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/aws-lambda-tools-defaults.json new file mode 100644 index 0000000..cc1205a --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GenerateThumbnail/aws-lambda-tools-defaults.json @@ -0,0 +1,28 @@ + +{ + "Information" : [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + "dotnet lambda help", + "All the command line options for the Lambda command can be specified in this file." + ], + "profile" : "VisualStudioToolkit", + "region" : "us-west-1", + "configuration" : "Release", + "function-runtime" : "provided.al2", + "function-memory-size" : 256, + "function-timeout" : 30, + "function-handler" : "bootstrap", + "msbuild-parameters" : "--self-contained true", + "framework" : "net7.0", + "function-name" : "LambdaTriggers_GenerateThumbnail", + "package-type" : "Zip", + "function-role" : "arn:aws:iam::723361041013:role/lambda_exec_LambdaTriggers-0", + "function-architecture" : "x86_64", + "function-subnets" : "", + "function-security-groups" : "", + "tracing-mode" : "Active", + "environment-variables" : "", + "image-tag" : "", + "function-description" : "" +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/GetThumbnail.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/GetThumbnail.cs new file mode 100644 index 0000000..d8fe5f1 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/GetThumbnail.cs @@ -0,0 +1,59 @@ +using System.Net; +using System.Text.Json; +using Amazon.Lambda.APIGatewayEvents; +using Amazon.Lambda.Core; +using Amazon.Lambda.RuntimeSupport; +using Amazon.Lambda.Serialization.SystemTextJson; +using Amazon.S3; +using LambdaTriggers.Backend.Common; +using LambdaTriggers.Common; + +namespace LambdaTriggers.GetThumbnail; + +public sealed class GetThumbnail : IDisposable +{ + static readonly IAmazonS3 _s3Client = new AmazonS3Client(); + + public static async Task FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context) + { + if (request.QueryStringParameters is null + || !request.QueryStringParameters.TryGetValue(Constants.ImageFileNameQueryParameter, out var filename) + || filename is null) + { + return new APIGatewayHttpApiV2ProxyResponse + { + StatusCode = (int)HttpStatusCode.BadRequest, + Body = request.QueryStringParameters?.Any() is true + ? $"Invalid Request. Query Parameter, \"{request.QueryStringParameters.First().Value}\", Not Supported" + : $"Invalid Request. Missing Query Parameter \"{Constants.ImageFileNameQueryParameter}\"" + }; + } + + var thumbnailFileName = S3Service.GenerateThumbnailFilename(filename); + var thumbnailUrl = await S3Service.GetFileUri(_s3Client, S3Service.BucketName, thumbnailFileName, context.Logger).ConfigureAwait(false); + + return thumbnailUrl switch + { + null => new() + { + StatusCode = (int)HttpStatusCode.NotFound, + Body = $"Thumbnail {thumbnailFileName} could not be located in {S3Service.BucketName}" + }, + _ => new() + { + StatusCode = (int)HttpStatusCode.OK, + Body = JsonSerializer.Serialize(thumbnailUrl), + } + }; + } + + public void Dispose() + { + _s3Client.Dispose(); + } + + static Task Main(string[] args) => + LambdaBootstrapBuilder.Create((APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context) => FunctionHandler(request, context), new DefaultLambdaJsonSerializer()) + .Build() + .RunAsync(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/LambdaTriggers.GetThumbnail.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/LambdaTriggers.GetThumbnail.csproj new file mode 100644 index 0000000..f62e809 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/LambdaTriggers.GetThumbnail.csproj @@ -0,0 +1,33 @@ + + + Exe + net7.0 + enable + enable + Lambda + bootstrap + + true + + + true + + + + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/Properties/launchSettings.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/Properties/launchSettings.json new file mode 100644 index 0000000..5870340 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Mock Lambda Test Tool": { + "commandName": "Executable", + "commandLineArgs": "--port 5050", + "workingDirectory": ".\\bin\\$(Configuration)\\net7.0", + "executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-7.0.exe" + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/aws-lambda-tools-defaults.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/aws-lambda-tools-defaults.json new file mode 100644 index 0000000..3bc72db --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.GetThumbnail/aws-lambda-tools-defaults.json @@ -0,0 +1,27 @@ +{ + "Information": [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + "dotnet lambda help", + "All the command line options for the Lambda command can be specified in this file." + ], + "profile": "VisualStudioToolkit", + "region": "us-west-1", + "configuration": "Release", + "function-runtime": "provided.al2", + "function-memory-size": 256, + "function-timeout": 30, + "function-handler": "bootstrap", + "msbuild-parameters": "--self-contained true", + "framework": "net7.0", + "function-name": "LambdaTriggers_GetThumbnail", + "function-description": "", + "package-type": "Zip", + "function-role": "arn:aws:iam::723361041013:role/lambda_exec_LambdaTriggers-0", + "function-architecture": "x86_64", + "function-subnets": "", + "function-security-groups": "", + "tracing-mode": "Active", + "environment-variables": "", + "image-tag": "" +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/App.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/App.cs new file mode 100644 index 0000000..e3f1208 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/App.cs @@ -0,0 +1,9 @@ +namespace LambdaTriggers.Mobile; + +class App : Application +{ + public App(AppShell shell) + { + MainPage = shell; + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/AppShell.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/AppShell.cs new file mode 100644 index 0000000..a9608f5 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/AppShell.cs @@ -0,0 +1,9 @@ +namespace LambdaTriggers.Mobile; + +class AppShell : Shell +{ + public AppShell(PhotoPage photoPage) + { + Items.Add(photoPage); + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/GlobalUsings.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/GlobalUsings.cs new file mode 100644 index 0000000..4645a0b --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/GlobalUsings.cs @@ -0,0 +1,2 @@ +global using CommunityToolkit.Mvvm.ComponentModel; +global using CommunityToolkit.Mvvm.Input; \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/LambdaTriggers.Mobile.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/LambdaTriggers.Mobile.csproj new file mode 100644 index 0000000..2ff4e3e --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/LambdaTriggers.Mobile.csproj @@ -0,0 +1,65 @@ + + + + net7.0-android;net7.0-ios;net7.0-maccatalyst + $(TargetFrameworks);net7.0-windows10.0.19041.0 + Exe + LambdaTriggers.Mobile + true + true + enable + + + LambdaTriggers.Mobile + + + com.companyname.lambdatriggers.mobile + cc5739ff-93ef-42c2-95e9-21d8898fcdb4 + + + 1.0 + 1 + + 11.0 + 13.1 + 21.0 + 10.0.17763.0 + 10.0.17763.0 + 6.5 + + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/MauiProgram.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/MauiProgram.cs new file mode 100644 index 0000000..31255b4 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/MauiProgram.cs @@ -0,0 +1,41 @@ +using System.Net; +using CommunityToolkit.Maui; +using CommunityToolkit.Maui.Markup; +using LambdaTriggers.Common; +using Polly; +using Refit; + +namespace LambdaTriggers.Mobile; + +public class MauiProgram +{ + public static MauiApp CreateMauiApp() + { + var builder = MauiApp.CreateBuilder() + .UseMauiApp() + .UseMauiCommunityToolkit() + .UseMauiCommunityToolkitMarkup(); + + // App Shell + builder.Services.AddTransient(); + + // Services + builder.Services.AddSingleton(); + builder.Services.AddSingleton(MediaPicker.Default); + builder.Services.AddSingleton(); + builder.Services.AddRefitClient() + .ConfigureHttpClient(client => client.BaseAddress = new Uri(Constants.UploadPhotoApiUrl)) + .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(3, sleepDurationProvider)); + + builder.Services.AddRefitClient() + .ConfigureHttpClient(client => client.BaseAddress = new Uri(Constants.GetThumbnailApiUrl)) + .AddTransientHttpErrorPolicy(builder => builder.OrResult(response => response.StatusCode is HttpStatusCode.NotFound).WaitAndRetryAsync(3, sleepDurationProvider)); + + // Pages + View Models + builder.Services.AddTransient(); + + return builder.Build(); + + static TimeSpan sleepDurationProvider(int attemptNumber) => TimeSpan.FromSeconds(Math.Pow(2, attemptNumber)); + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/Base/BaseContentPage.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/Base/BaseContentPage.cs new file mode 100644 index 0000000..436127f --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/Base/BaseContentPage.cs @@ -0,0 +1,14 @@ +namespace LambdaTriggers.Mobile; + +abstract class BaseContentPage : ContentPage where T : BaseViewModel +{ + protected BaseContentPage(T viewModel, string pageTitle) + { + base.BindingContext = viewModel; + + Padding = 12; + Title = pageTitle; + } + + protected new T BindingContext => (T)base.BindingContext; +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/PhotoPage.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/PhotoPage.cs new file mode 100644 index 0000000..c3d3957 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Pages/PhotoPage.cs @@ -0,0 +1,100 @@ +using CommunityToolkit.Maui.Markup; +using static CommunityToolkit.Maui.Markup.GridRowsColumns; + +namespace LambdaTriggers.Mobile; + +class PhotoPage : BaseContentPage +{ + public PhotoPage(PhotoViewModel photoViewModel) : base(photoViewModel, "Photo Page") + { + photoViewModel.Error += HandleError; + + Content = new Grid + { + RowDefinitions = Rows.Define( + (Row.Photo, Stars(5)), + (Row.UploadButton, Stars(2)), + (Row.ActivityIndicator, Star)), + + ColumnDefinitions = Columns.Define( + (Column.CapturedPhoto, Star), + (Column.Thumbnail, Star)), + + ColumnSpacing = 12, + + Children = + { + new ImageBorder + { + Content = new Grid + { + Children = + { + new Label() + .Row(0) + .Center() + .Text("Captured Photo") + .TextCenter(), + + new PhotoImage() + .Row(0) + .Bind(Image.SourceProperty, nameof(PhotoViewModel.CapturedPhoto), convert: (Stream? image) => image is not null ? ImageSource.FromStream(() => image) : null) + } + } + + }.Row(Row.Photo).Column(Column.CapturedPhoto), + + new ImageBorder + { + Content = new Grid + { + new Label() + .Row(0) + .Center() + .Text("Thumbnail") + .TextCenter(), + + new PhotoImage() + .Row(0) + .Bind(Image.SourceProperty, nameof(PhotoViewModel.ThumbnailPhotoUri), convert: (Uri? imageUri) => imageUri is not null ? ImageSource.FromUri(imageUri) : null) + } + }.Row(Row.Photo).Column(Column.Thumbnail), + + new Button() + .Row(Row.UploadButton).ColumnSpan(All()) + .Center() + .Text("Upload Photo") + .Bind(Button.CommandProperty, nameof(PhotoViewModel.UploadPhotoCommand)), + + new ActivityIndicator { IsRunning = true } + .Row(Row.ActivityIndicator).ColumnSpan(All()) + .Center() + .Bind(IsVisibleProperty, nameof(PhotoViewModel.IsCapturingAndUploadingPhoto)), + } + }; + } + + enum Row { Photo, UploadButton, ActivityIndicator } + enum Column { CapturedPhoto, Thumbnail } + + async void HandleError(object? sender, string message) => await Dispatcher.DispatchAsync(() => DisplayAlert("Error", message, "OK")); + + class ImageBorder : Border + { + public ImageBorder() + { + Stroke = new SolidColorBrush(Colors.Grey); + StrokeThickness = 2; + Padding = 12; + } + } + + class PhotoImage : Image + { + public PhotoImage() + { + Aspect = Aspect.Center; + this.Bind(IsVisibleProperty, nameof(Image.Source), source: RelativeBindingSource.Self, convert: (ImageSource? source) => source is not null); + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/AndroidManifest.xml b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/AndroidManifest.xml new file mode 100644 index 0000000..07a3108 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/AndroidManifest.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainActivity.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainActivity.cs new file mode 100644 index 0000000..f534a9f --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainActivity.cs @@ -0,0 +1,10 @@ +using Android.App; +using Android.Content.PM; +using Android.OS; + +namespace LambdaTriggers.Mobile; + +[Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, ScreenOrientation = ScreenOrientation.SensorLandscape, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] +public class MainActivity : MauiAppCompatActivity +{ +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainApplication.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainApplication.cs new file mode 100644 index 0000000..75551f0 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/MainApplication.cs @@ -0,0 +1,15 @@ +using Android.App; +using Android.Runtime; + +namespace LambdaTriggers.Mobile; + +[Application] +public class MainApplication : MauiApplication +{ + public MainApplication(IntPtr handle, JniHandleOwnership ownership) + : base(handle, ownership) + { + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/Resources/values/colors.xml b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/Resources/values/colors.xml new file mode 100644 index 0000000..c04d749 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Android/Resources/values/colors.xml @@ -0,0 +1,6 @@ + + + #512BD4 + #2B0B98 + #2B0B98 + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/AppDelegate.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/AppDelegate.cs new file mode 100644 index 0000000..a2d18d7 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/AppDelegate.cs @@ -0,0 +1,8 @@ +using Foundation; + +namespace LambdaTriggers.Mobile; +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Info.plist b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Info.plist new file mode 100644 index 0000000..8a79844 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Info.plist @@ -0,0 +1,35 @@ + + + + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + NSCameraUsageDescription + This app needs access to the camera to take photos. + NSMicrophoneUsageDescription + This app needs access to microphone for taking videos. + NSPhotoLibraryAddUsageDescription + This app needs access to the photo gallery for picking photos and videos. + NSPhotoLibraryUsageDescription + This app needs access to photos gallery for picking photos and videos. + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Program.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Program.cs new file mode 100644 index 0000000..f2b49e8 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/MacCatalyst/Program.cs @@ -0,0 +1,14 @@ +using ObjCRuntime; +using UIKit; + +namespace LambdaTriggers.Mobile; +public class Program +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml new file mode 100644 index 0000000..901fba3 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml @@ -0,0 +1,8 @@ + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml.cs new file mode 100644 index 0000000..caab455 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/App.xaml.cs @@ -0,0 +1,23 @@ +using Microsoft.UI.Xaml; + +// To learn more about WinUI, the WinUI project structure, +// and more about our project templates, see: http://aka.ms/winui-project-info. + +namespace LambdaTriggers.Mobile.WinUI; +/// +/// Provides application-specific behavior to supplement the default Application class. +/// +public partial class App : MauiWinUIApplication +{ + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + } + + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/Package.appxmanifest b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/Package.appxmanifest new file mode 100644 index 0000000..d473f05 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/Package.appxmanifest @@ -0,0 +1,46 @@ + + + + + + + + + $placeholder$ + User Name + $placeholder$.png + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/app.manifest b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/app.manifest new file mode 100644 index 0000000..e64ccce --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/Windows/app.manifest @@ -0,0 +1,15 @@ + + + + + + + + true/PM + PerMonitorV2, PerMonitor + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/AppDelegate.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/AppDelegate.cs new file mode 100644 index 0000000..a2d18d7 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/AppDelegate.cs @@ -0,0 +1,8 @@ +using Foundation; + +namespace LambdaTriggers.Mobile; +[Register("AppDelegate")] +public class AppDelegate : MauiUIApplicationDelegate +{ + protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Info.plist b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Info.plist new file mode 100644 index 0000000..669fc09 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Info.plist @@ -0,0 +1,37 @@ + + + + + LSRequiresIPhoneOS + + UIDeviceFamily + + 1 + 2 + + UIRequiredDeviceCapabilities + + arm64 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + XSAppIconAssets + Assets.xcassets/appicon.appiconset + NSCameraUsageDescription + This app needs access to the camera to take photos. + NSMicrophoneUsageDescription + This app needs access to microphone for taking videos. + NSPhotoLibraryAddUsageDescription + This app needs access to the photo gallery for picking photos and videos. + NSPhotoLibraryUsageDescription + This app needs access to photos gallery for picking photos and videos. + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Program.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Program.cs new file mode 100644 index 0000000..f2b49e8 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Platforms/iOS/Program.cs @@ -0,0 +1,14 @@ +using ObjCRuntime; +using UIKit; + +namespace LambdaTriggers.Mobile; +public class Program +{ + // This is the main entry point of the application. + static void Main(string[] args) + { + // if you want to use a different Application Delegate class from "AppDelegate" + // you can specify it here. + UIApplication.Main(args, null, typeof(AppDelegate)); + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Properties/launchSettings.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Properties/launchSettings.json new file mode 100644 index 0000000..edf8aad --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Windows Machine": { + "commandName": "MsixPackage", + "nativeDebugging": false + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appicon.svg b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appicon.svg new file mode 100644 index 0000000..9d63b65 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appicon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appiconfg.svg b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appiconfg.svg new file mode 100644 index 0000000..21dfb25 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/AppIcon/appiconfg.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Regular.ttf b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e2644a54abad6272c3afc7652317672e6a858007 GIT binary patch literal 107184 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 z zPf4;I?!H0)6fpftaXkPWOv(iZlfIAi{EHeJb}$JL0;Gh*#1G+ZaRf~e-nxJ`aPFuK z!dv05;Qc51+HdRj`C?jgM>8IQ*lq6;mFAKm-%Qs_C}Eju~O8tF`C)YY&Cjz|gLD#n=N zz$)1qf)Igabo1pmO* z=MuNw8o@b|cHV!#Cl~z{gc5t#!lm;|XIoSG8jr#lO~; zzgUX3(aY-Z)%Jg2W=wPs0Z|PL$+LI&{Y?CLRoO`%@u}m9vSwJ=^~R1pxrJJqru*Fr z1)>I#^-a(xnEYTm7Mj?r-k%pA^zt#rk|auv)oFjY`Gt5{VvkGGSzw0j;hXr(p;?Z% z8@wv=+$nGT{48DjvK7|Caz({M>pPZ%o20!}`;vZrQ6hUqmhi%*QEvw$ovZIK9tC)m zPkiuQDetqGh?`gEc{^?9VW7ic{DY14!M=}^_um_h=W`N+*9g8iQGgr2PWsaum%J?&`qgiWu(><&+}?CjscMIOOrE5OMM)s}+i|u;B|LZwW5b=4 z@HoRZ=9sQ^ehL9m3@#af!6iBrWv~CePxMfd{WIm~XGsf`x0rdV)6+lHq(Qg6tB7j~1&<(ik z?!1Aos#wQFUg!kz;EUuOurnNVX{@Yo%axxw9oyxt44^aq1G>VW-#Acn_Ptp2cIo3d zFO_%E>|)Opq-7Z4uV(EkqU_?|w-* zemSi{x0h6+- zs&=M77%RVLK z5F9O(#zQUMJw4yrG?#xsN?qY{x|-)Y)lQgyd4H|V!j(pG^~%D4U)o3FIeR}NCd1!{ z?^RFOU1;pTB7ZGTr#vYK_Tl+D%P4Pd)`#-@vhgh>luPBw2BT@o@wl|-5%L`Ey7glZ zZs6!Xjv%f@phPfXbmOSGj`fPf75J;(y*H;cyY*J>CHR2{r$6~VSPN;kX*&@oTXA+f z`OI_p5Jb4Xxt+&;-FFuX!}Q5Up#4vIRwWK*=TR+eB^OKZjR`HPod`Uj=v)fWu#7Rd zJknC8NDh~90ADe#)spys}e@TEwO_!!`eU(bO-X>nS)e8`J3Mbm;Y*hv}$37wYq myB^bdOUWzxMUm)BCZ9PxOxf`kVFPI;gyIe&u(Tc=oc{p~G8MG| literal 0 HcmV?d00001 diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Semibold.ttf b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Fonts/OpenSans-Semibold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f75b525a361a35536ffe2499ce6efd4f995b846f GIT binary patch literal 111068 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

F|@>6peUNpWl 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�SOGU}1(FLwR9Poq92 z*cuX(Fn(T0L`ZDH#92yHR^iZrL9Y%kdKS2I9$nTSfV}yU&~y(hlY(U{-QH+<7 z`#=8FJvsUCoXl_#LUlYR-F|E|;}W6eWS0R+~<{bWyuSjw%Q2`{jBoPm{OOp&?Nmx zW2O>dN5+oLErSQ-A`={hG2;pdjKs z=CgD#<){!41C9DF&&|7-t=@Uv}6D8p!HPVP@!S}C));ViHWx) z2pi)9=VETIvVme1Xdrgp@Qpw~Pxw*Bl1hYt#yk*BV%u&Qg9h!IPIn%XnqDkvleuCo zx;V_RO+r7PBl8$z0i<2JFZa={CqaQOegg|#q9o6Og%Vbcs3tYF)S}Vl3wybZ5zc$< zW<9ZKM$S?0e1A=8p?a*ymYU5A=FXox?~(a)Su$pDKf<~wf9!TmRz6m4y!X+Gefy51 z)1&Y(N7!3(#b1=j{5K^sh!VYZ-I$j7@^rfQ2n+q-vF-`8)?xXB3QsnnL~TfHdVs+< zh%pb}Hdub{Wg1xM6-9#v6>_kSBB{$gxu1_@+7oVsxxrMOpb-HTbOBb`bT^jHe{oby zRoU1rLuSvo^zezx^WRVu#;SJEpjm}Ollu-C(0fxw{wq&T+w<^i==&%cp)|@JfrGFZ z1{2tsWrKS_1T2P9Kwx0N;KIN_Q`@#-0}I)pQp^|>)8i*{_^cX;l6I(Fvt;f*D=N2%${-=(0(_E?Sn zJ6D~)Jmh4j#5oJ=s^7gewmdQYnKkb~76O#*a<$-u54=i5xWI`7e3VE&dhQY5&(~8j zP@Ru%aG~DC$4A0)@U}wU>{I(rGsAp&Dz*=)+k8bRa@fjKZCHsRS0B37{2<$L{g9H6 zz+D}ODBFXv(X#d#X~*43G_)%vT}Dh+QbEBwP%s9#gdj?!#ZzkI>xfBCyavJ?jy+9a zq`z73Hn0%h=p5{{Q%{)c1rn4`fRa|SaewJ*h;n!uWc~k5sd5eh9+nOGY~+^bmDjp1 zYggHY{nq@M)mFwbZyfzr`F+Tlj-4N0O7*_3J=sSmm9=^==woA1YkKL9Vul@xAh7KZ z%Jl%YddQrgQ(W-2Vkz4o>`VfRVkV(=<0Tq&HAFa;R%A3ArJtJ*0LraTp84Yva^R~0 z(?kxzT*rb$ZIx3YQGsZwGt+G$-VyfL=+RMF%itM47)w1RKfj=Xg?>?zad4sZC!+8v zR_B>w%n+!}m$#22;x-RS>FpeHJ4#Mf;Iws7*TRuMeCz6#_I&Mu^OXL3^R+n&oB2rn ztm)e_XJdQC5M_khV>v?FS{s_edUI*N<-4tCyFb zYx>9OHL`xcw6kbR{Ro&%)dE~ zHqLLp$j5D=(Au$I9~yNkxNIOZsXA_mM%3k-IzrO)q!!SL9O%l##eMIC@1<@`G_J!Gwbq;zz zvkn#2;rcirDOJqB+xOtG(NE0RFI+!+0YgBwNnf70_T9Hbv3jX$O+*R!m{7u4klO&DpJMEs)H=rC z?~U5~K`6KL*jiA4TZqK>20EB#t0~l_b)cz8(V7G63Ud@7sJ496)dR?vd+w2l*IRIq zKqcr9Vm~yt>vLH-fK^|A^arjje<0-rK01{!`i4ECkMe{%F4RU{uY)NYol;C|>3466 z77U@-?$#7E7f}lCwUSb#sNw6s?72)(zC;SXs#mi-w!DTkAMml8ng)AzKUASO)`_>= zL5i7tC7?aUK;?5ah2B28Yxx2xHX251DF!K@swrg0_-_DoD(-hdz#w`$G?{Y@Wu*Tw z4A8zCOoG(!G%6fWD&$~3gTwQN6nA7(_~^FM8C)hg9s%iN}x&FG-XYp_V}(`W+A3J+n+@s)Ov2I7zUsYAUq z!;>N(GfU(f$Q9mVoTdJIfXpU$Xg$5jCb37^YwWyamU>DLO4Fnb(p%DRvPCYF_v?(h z5xUoOpXqzS>hr0=Z0KSbXJ{~7HdYyTx)@z@T;{sG<#N@OY$`WxH0?M2;Tq`rpz9{r z3vOXsXC%A8R|H-3+$4HOm9!(y{J%02I^z7t0$a5zg^ma2ZH-C)=?QO5$ zz2m*>z4v&Z@QLzy&}WO!&%S+qr~7{3XYlLoH`(v7KlShJKh^)B{}%zV0h94>Tfi@Y z0|H+Nyc=W=ucto z!_vcshdmT_EbPm$@57XE&v0vaV)(M~_2JvY_lAEI{$=?0;flr6Vzty-7FyO?p116_ z9IO|CqsGp))w0E>EIxadjdPnp>qK`#?8GR$V8LoEPAVfxLyT0uT+EuixZ@0AF zrgks2+uiPPyU*KQkLeckRLstp_hL@QT#UKZUTW{rKB#^B_PyH=Y+u-ZLi<_m7q?&4 z{&@R;xBs#IAF=w_fY^xGPO)8Mr^mh;yFd0+>{qeZVt?=8(!sAoafg>Xywl-$hktkY zp(E+&)v>PQolb6@LOQkU)VWhur{SH-J5B4fxYPPh&vbgV)Ba8;JDuxvrPKe!NpZd6 z*2TRLw>$1g+~;xE<9?5KjSq?M6rUbHAif~JGJa%P< zgk_1oiH8zDO}v`;Taq!!Cn+pxK+?lWtCIF7UFh7VbKlMjJHOufOmbv$N^(K+gye^l zA5Y$ryes+r*zVcONMF+TKb{%PkUQ?$MjC<-KTeM z@0}UCjLeMT8RZ%4G8!{3W?awssZX~)efq5G^L=JiW@_fd%;z#+$$T^OoytwcT_TcP|*`M`|==(_D<9*NMB;-7i)0FdjKiY3_za9O)?suzy zyZ#UMf1&@`{ugr%xt_TJx!rR!b6?1PHTS}R&;bJnEE(|eK(B#=25uhs`=CC9@&_Fr z^x5FZ!5s%D5AHj7@Zc8*-yJe`NY#)zLtYv3*^uU;9z(;1#tls$nm4p`Xx-39hdw#9 zY3QM$KjnGl#peypo07LJ@1MhT!+H9{N7ZkG%y*-`Ra>A=zvr4N=?ls;DaeCh7eBc-30UMm|{w!7S? zytMq#`0()$jo(!fSTVKYtIC|pgA;m8`1YZN4?XtKnuo4W>@jiv#Df#hOuRa&WYQN^ zgR9=Io-#Rj@~$cErc_SZG3ECfTg`}?M{0J~elWFo>Zf&m>eko&Fm2GZcc%R^y~FfJ zrk|YAVaAdfYi4Ynak)Oaep3CunTDAoXKtGL`K*9h56oIM>-fXb56_&fo4tJY#@Wx! z{&bFUj(JYzoQ64{%=Mo;cJ7mN&(3Q*uWH_r`Ih-(=C6N5ex&Y^8w*MnJhb591L++>Aqyp zk_VSeS+Zcs+9l5~xxKXS(t@QGOJ^=!w)Cl`I~$~i2O26HW;Q(5@KnRjhIboIHe77@ zd6~S-e_8ahVaw(&Te<9+Wv?##$FjrAPCpj$*u=-SKi0I|eff;#|9-sJ;~O5ou_AND z`W086NPc3$6Q@>stsJuQ<&`a~Tvr9GvaO0+mA-1|s*+W8s}`@?xay@<@2onp>f)-~ zt4*szR(D#RzB+Gp>FQ~#m#p5j`qkA3SD#pYZuO1T&1*c?gsq8Rld&d$P5GJ`YZ}&U zUbAz}!8M<)xwhu_wYs%lYeUz@tnIosckP(9)obUkUA^|XwY%3IU3+fr&2{oRzjcx8 zQr2a!dthC~y83lX*R5Um^txBp?OpfLx^wGptZQEHu|8~l-1_wOL)RCtpR~Sy{i5|N z*Kb?@`uY#n|7-n)4Xzt{Y?!=Z*GA8cnH#5Vd}mXeO*xyYH?7pKYUxvJpSs*Sd$Cg1`MymZTp+V;&PrlpoplA1AiHi{r2{}68+u8hlCideq zck-LxH3cB55nME(XBI!qULD{UGPcJsek7Ac(rmIw7fa&gm84pKndIwkkRp1EEMiMZ z9*!RJIMN^QikOY`!V>cwmV|G@i5brdaBRXc62}M}(KzaGjK#sf;qOQA^em0^!gUdj za(K@s>>k<;18%?cb*)Or{l=L{RvX9htF(wiS%csEv33pJRd<07{-wU z`b-=HNIhmR#96#6C#CXY5~{mN-jJcK8W86JXPM7$%bQ3BdzNhCIOCio4G8u<~W;EV4%9u6QFC`eykRTc5lTMRNDS&j8E9hDF8_t}TcG~0mc^o-7INiK? z8kvz=;1;RhPDLrc<>MKVl&SCxGJ9`)enprw_;Tznr-|3z_Re3oM z)ECgqaUOHe{cm_al6bJuEtq?<=Y8K<_ZgA2cf7uVrlQ_Coek?qy>J2I z-2j#MT;{plIm)KtdW>Acs)0-LVQRyQ9+|fVaw9FGn@Iqk-;lS1_l@+r+(@qL`nTNT z^-fk=_UhNQ?3F%iIiTOr@~Q4r%d7g*mQUH;md_n+9ai!kK-(23WCpl#-t)XUPdVLm zkO47r5YJfa8g;=ObO&v;w*8QMIg6Ed@*K=cOXS|I1XyA)7>oOrjkOv{Vz?I9a;Voh`oKn;1 zY)BIX|8OX)pcTOxeS`S+DB5$tGDL!B*GYjMvds_i%`w2>{eqp2{CnOvh;|IL;xIK@ zdEgAsl1Sb2q*jW9+^!^}#WPjED8lN?ap1p=AE<-dI9(7N zvld4=KhXb0<1pjM!4Zoi4M!Y~Xp|qWRRtZyne9M-iF-N%&+2iVgzHUsfQcE$59#yy z!SkU@i5dJ4l8>UUjwCiNe?m9lw1w>G=PNG&W;xqL78^~(#t;1j^oh|Z_hz(duW>uj z-Of0EAmmOn&Nm5ZHi`NIxfc9~d_jAgtv`i*>!rk`>qtz7ddPVs_`VJKoWfkn8@PX2 z&@~)#Wd@B8=&yqA=b-0AgVwxl;PrEm+J5WC;yc)+9A{G~sW+YmPL05=fRq~x(3hiq zF!m=CM83Sv@_vrjg*rqlYeaOhM#TPVq@NkClNgjaM*lAA%wgnt9c|ia$RqlA(a#o; zIO%2JJsyV* ze}EQ;Kw}yAX}~oO^~2sri}uhAIpu9WZ`18(T`ly#eIy9`T|@Oo605sQmgz>|K>f#N zdwxEkBfu+?gzM%ao&C()C*IERx{kH(0!MvE;FN&lH++NkQD1@cI^fJ<@%nrabcb%p zzvXQgmjTDw(Z7JVO`;8nBg^o<2r*;D*^!rnE?DE50Ua_%v~Q3B?d<4-?Yz`@igt^) z9lV|6ZOxy~b{x^)AK>i?Z|_8#l zOubD8VLOl!I2(?m(c&{y+JQdxBKXE-@VX5o#}PodyS5N z_ng-mPS^i%_QQL>zk4tGqi$rn{k)#{w|}MU*q>Yf_PwKi|CjUqI*p?}_-|*e?dI~$ zX=*=nJrr#SEaP`EM{p-!J>SKo_FaCh9rRfeO79Y1en<;Y*WMtLq$wmB{cAGX)e-Uv z=rw;aeuM66L;p2G)6pOsTt1u+*trj|DJ_5C{5sBW;!JUV4aXfEU*LWKe~13`fMjk# zT8u;a3tWnlZ*0B*RLLcD?t8tr%u!z`*oQR@`vdE9_KrwA;#{2>= zWj}Zc+DbkqCuuvZL>Na)QI4(jRg~io7AVT`An$t1LYVhkCBVyCGr#UDwN}Zd_q1MM#6fA%?sNab_CY%TVcPT9K_;d39wj1IT9^t z_Hs-`Ii5i|Ub?RwqwMAIaweABn@o2)bc(%*782)P2Oi6Ti$PJBJV+t zid*`jl%!>yvPfB|OlzrVDQOwkGKP$A$!tDJ0-8@We?nZEKWRSR@_X}f5r`rS=R zo92z!PvfSzHdiPv*jDbMe6F~BQ}9jTrJ3KrqVmn`OCI0My5#F2m{&4a8i{D3b8i$^YQyg2RRR6;HWUUa?a@^#e(<-(l{zg#$SA@V}Rg*F$0E_h$? zyda&wdj913<6l<7CNP){gQPkCFk-*&_wIf7|M?bcj>QkX?BDzxDgNfQ_IR3h^`9@$ z!tkH;B>7I-Oum<%B0oxv>+xa{*Sa>%0}I&VAiaP=-#bsT9?$677Dt3BY z)Rc~t<@cpbS5u~IDXH1gopk3}*ep%QGi{bVbmY(iTrbbG6D(p|2mKDIt(rj8xRE|V)RU2)aa&Ng`$ZP$~E3)U{H>n=u& z?mSzRG^@C@X~@umtW2zJEbQ2!Uz3LoknoE15g?oNeVPmcq@@z2f_7lp)nR|bV|&bG zTv4oBsjaklbU~9;jBgvHtcHfgO-Mf<|Rc9c-CdO|cwmZl0D;Zflm9 zRgN^wxrnrhQrCSWfj@~Ppb$- zjusF)Csq}N{DP+ROi(Pn*e)blyW->UMR5@rR>}D~w4f=@Ho3{ymZ3@!9&og>Du)$_ zPt>PbO}>4aNKuLXtERXtd<)UfYT%N_QQ)v_Lksr8)x(8doh`wyCt-n0VJ03o`S*d8 zMP)SZ=DEC5%n zh2jl=!NJLqS@(gl6$GnbAb?HANTa2I1xtlUXvPCeHZE)#-SM}{5NX6=2EoNsF1Q)p zEd?}~I8p;^Nn_1H)^JJ!5=skbR9Xgdp|=#+%4~(U3QJS^kOEF3P98yJJ23>!Rj%ab7dYQJ5esA@ zR=gIJvlFu^J65A1CvH<;aqpltWai%2{T#0?4Mtn;um;Wvn;jql=KY!o7vc0SUMMzd zKCjR=w7nKHs8Xp}W%Ql3^nY_L`x?EXgl;jZxO8D5G#!Tf8gSYat|EJZ1bTf5?+q_zj1Yha00v zAG|l6ka^;*EFOsal0B4&XKErmqoiaHQ=gedx?NEsqjVSwO7_U=n{)>R8PAOBvw7lK zA^+_noTBL_UAi&dCEbm=v*2C88kph9KJ@=Cl)Uan-D&VHd<7iwcn_Vo%OyQnO)(EC z(hF6LhvQ_=dicnK*WCy{6MvCW2LC}^0xM86(BEWPO1YpsTv*XiRLCnE@ds=0AL^>D zC)i}`2}Ja6O(t7eMw6>8gFo-ZpZ8Lq>-lqoEu#r5Rq^>e)Vm=~6o2za6H7(yOvs!K`+m%MZ_`m$Y za>al9$sYLHe1@#S)p2r&oFMziCYk`fng2X-htUs0E)Y_IL%pU1Ug+)D3=s_154%T8%@Setp${#*}lGS}?a2J$R5*{_YH9o=cab|qctr}k?%GMahVuibGy!G7%l zyW5BMYlL%@+SsqXh*|1DGD#&Fk7Fv1nWT)AVw6)#ig90zs}lI1noR0RjYw62rxx-e zjzkhq67a7BuKOZQHDFA{*A~(T*ERTt|K(6BaaDyF;Dhn33|AI149}}bt+*;9laL|< zX(l4qJfs*;>Tq3*uM_Z90`lpGzrFEQA6z-0IACQ zD+QjM5>rKaN=0rQyNB?s8rFmR%g@WkX*daGsKJ2!>z(>8i z_Zu#4_wzRq*vJ1Z-mS1YiL#DI87JO@M=hQVz_`8-$s&UwO&HqgNqVt~oq1-lenv6I6c?SUsT6Sy=YK4{7Oh(Fq>K&%FD z1OF`{*xM6E!ck%?+5sEdh)5DeqG6GVA?-;lm4Ig_;Lht|BH^lGGTM|>(uJgf>)l9q z(u4FQyyHq z!A8G>{7QZyx5+m03OR~hemhYYO2`wCkz?TW5%Lk$W2di?x*%dfId%h{B&X2bj3+m- z!}C+}FLDN4{f>N3mcmnECF&cOp(u|{2(ROHknw4d?Qh8pv|aUN7S>5Vj8^(- zbX;>_dzw#fkRQlCcmi~#TvhO(o}`&5a8Ba|KWhk%MhW$WqZ)q-XF@cP2GKS&n1;|$ zM6C#?7VI33Ait5{sf~}uX%wti?cmy`J)F>Wz{=!KG!6ks5@69vBA?ODG?}K*RN956 z(XO-`?M{2po``*sPJ7b~@-?|c`_N39MYG{GCr6C%bLjv&5V1lB(;;*ydX`=Ausw|C zBP_-U`T#AUh495NirgW0$v5OOB591FW9fsKLoJ5gsRWj%GFnc@!<|bdoj@O=6X_&c zMXTv#I)(g$*3eoymDZ6fQsFUUFaCHab6fFI%W zu*l7$^XVgW0bL01TaO|D(Gt3pHXv5-V{p~H_xL@a=p=*#pKgiC)FYSJ$H8hxFhsaJxD*Ghv1XtFIN<$) zo}*vVujs$&d3u3fq+ioZ^c#AaUZGd%HF}+XOTVKx==byo`Xj7#KhazCXZj2Mm0M5f zZ}fNi2fah@(q^i_5=o#JGbSOVgO2H$0a~vMGa>X9*FHU%Co?lI=FNPVFY{ymEC3e2 zAl3%<%McdI!dN&|W-E(eHrAHG*EWl0?N|(J&tjn=yv{nXj^r(}n|#1JkvGVj&>tQl z?~}#kCGsJQWAX5_`5sFkZ?i=5KP*Yua#CPV>;jEp3rk~NSvQ1q?E$Zw+o3mXgi`h# zEWew{3uFcKk+ozm>&betbk>_?us$r4WwC75m*ud2tUt?T1K2<|hz&-hh@mWx4P*Ii zI2*wpUqFHjm9`kFW)7AzOrX%8S_&wv;unW$ZDwoITD~uqW6` zwu-H0YuH-0j;&`K*haRAJ;^q+r&uG~!nU%f**5kJd`vyZo@Xzx?d(OigT2IFX0NcF z>{Zspc477N>+B8oCVPwRW_#FPwvYV-*5h~ByX-x-pB-TDvxDpdc8Glli}DfJVn1TX z*vITR`-GifC)p|XPj;I9i=APgvd>_rJ^pXYeb0ViKeC(bCw7bd%zk0NBA(p;u;1A4><@N_-DS;8VJ)!vQi;LtD@!^_ zFBv2wEWjqo6<)2}5eU!|tG2x)Z^=jUmHZ@s3GU0JAgPTMEQLs+QkWDjStP3zA=#w1 zQlu0mMN93Z7^%G!D|L`MN}Z%QDPBsD5~U=mvy?2QNU2g6DNX7sb(6YFJ+L0Umy|B` zmNKM1Ql^vzyI@}_N9rf_mvW^6(m-jDG*}uU4VChwVF<=HTpA%gAQec3(nx8PG+G)X zjm3KMBB@v!CzVL0QkhgPjh8B8krJ)bVkkm{wG z(k$s=X|^;+nk&td=1Y%A3#5h8BI!|Sv9v_k@Rz}gzg&7;S|L3lt&~O&jGw7y)3;VSJh3N zsO#6Mc;Zw;T~%d#eD6$`>S<*)wI$UxWu|`PYl^3p@t3B4#U*u9#ieJzlFFKrx=G~| z%VzLb?l2OS)s)p%)(R-SCl!~}R96{_)w90$xSFzQW%^=qGW4zM0Yji>Dg0?3t9=Gs#jjDHA7C7QQPkDJiR(YAVw% z4O#ZA%haXV{x4tFSlO`3baNWi`-MHqorgyDqy_R#v z71ziW_+#ofwQ^#qpq{=`T)OsCF&8AORIg3_1p54uzEWJe_ET|HQ>oV;{j?&9l>Pei z6RVuy+P^hx*9ooHZn;jlx;=Ey&G?$KvZ{&2Ri%|B`T>H&`ibJ?Ho!UEM5i150F`bN z#YrB(=`#_3^n=vztJLoYIep?*<#eMTq<&we(!Hv9a&_(0n(E0FWl~nvc&V&vykW4N zyVZ8?4pzBaEl%!(E9$Do7uVEHnpj*n)xFyJPM@dZP^03I=aj8mjnj=jPsO1|Jq=U8 zsud^KVXdTdt!=$_%Xb3cHr44ypRaHFmcN;vZ zlD9VEf!lDW4@`q6m5o;udR5|+d-BtX{N#+Xsl~d!#XwE8eMxDZ4fZ_ck$5E`PhEZm zu8cfWo}Vtac=F_8RFz5NN{iXRIyR_|6;wiC1r}^brIc4uts7Q3ep0cNUtDLfVUp^=)T&`xnW{oUGbi3cu6Rr)pPSw5v47RZ6^erRA04$Sa|9vg2)n z1|>m*lAu9J)Sx74P!b(b;uAYNpd@PW5>vEi8stO`a-s$~NrRlEK~B;jCuy`u((*{s z@<`J1NYe61((*{s^60GP(OJu*vzA9^EsxGx9<6lgtmV;J%cHZFM`taM6b-8s?TZxc zixlmP6zz*t4XacQmsAaxR1KF@4RWdmIaPz4szFZGAa~IqchSn*Ma!d$mPZ#Yk1kps zU9>#9XnAze^5~-Fk*4L5rsa{Q<&mc4k*4L5rsa{Q<&mc4k=hEykq2suU4|0k9d8rj z9eH3!t@hTDM?$Ai~a$jIO?aXrw2s$ zpr0;IE)O`G1DENJD}AAwuwI-5hN$rIUEJ%cO6|I6>9~pRQ|iz)aBZ@twyab?sj>mQ?x2Y9Slho^4*Ye6~j%&AC;8JCO!JEtMjQ9lm zInlkOzNT{G#L5!UzZ=oJPAsdfonRJ9f>VF!>U8bpbX~(6_cFJcWi{1~0=bn}*VVM% z01?NHYi;EW$F;k_O1l&2Iqux5Dyy`QIHrm5@$vTa|I^)fKt;7IYfm5!AUTL66$y&4 zCowZ3=m0Z-LgQ8IZvva5yL+1{6V5FmhBt5ik)9m{1hOjDPPv zjdHx_-TS|_{`=pzo-DhjdWWyNdskO=Rqq*0a==p{Plc2QDIHQ{NEwhaA!R|zhSVIT zTn?9uQ7+d4QcIK~WG;q_P|UG&G1iX=%^2%PK(Y1#iuEI) zSU&=a^&_BIKLU#NBcOtQq8U%(Vf_N?v3@~l42aKw_zZ~8fcOlE&w%(0h|hrd42aKw z_zZ~8fcOlE&w%(0h|hrdOo-2f_)Lh;g!oK|&xH6)h|h$$Oo+>bxJ-!4gt$zI%Y?X0 zh|7XFEQkY~IQ03Vu^*lSrCr}@mLU#1@TxAj|K5q5RV1%*sz^!*iJUYXG458 z#Aic%HpFK`d^W^qLwq*GXG458#Aic%HpFK`d~=9z4)M()zB$AHuZ3n+sHl)(bZU;$;Y zfHGJ>87!a-7O)R2pbQoqh|T?pZ3+7U&Kop1Z_q5E43rVLw>Hao|9F4(tOC>;n$O=RkZ8#OJ_1;6Qv1#OFYK4#ej`d=A9t zKzt6w=RkZof6}-Rp9}H15T6V2xe%WV@wpJ63-P%Sp9}H15MMA~BQ!3==R$nJe2&oJ zd`O40CS71RK)nE;jtKDShyb6C2=M8M0H2Ns@ac#EpN4*TIjtJUMhx08R5#ZAi zLHog`JM0;xlLhUklLhUklQDcUN1&&GV#fi+jsrS*9Fq_5n0$a@@&Ss;2Ph^VpqPAs zV)6ls$p6C?+47BhXVoA-+IQ0T1y7dJ1@mFVIuKLwtdr0v_TE^c3(A zU!bRehxh_L1w6#J!1{;G5$GtOu>ArZ1w3rOKt}-&+i$@@bq(;$NnHbSxKu-aMatQPk@K6qco&p}qA<$F6!*LMkDd6Ea2=o;2a2y1B z3V4Vw&{Hx;pr?SsaS-S!;Ndt3^c3)L90Ym_csLFMJq0`*2Z5df9=2bgr+|m;7w9SA zVfzJoO6Cak6j0b+fnEY0wpXB+fQRiB=p_Y#c7cj;<$s28Fi#pdi~dvUFy9%illyrd z>c{+Y8WxN~>!x9j>5n@J*dI5M!j4W}FF5$)QkhBL7Cjyj6dW%*S>X>nW>Dv5@oSBp zg&1(C4P&AbB1KW3)-XCw1g!uhJ`v@_FfSW?5JkOQi~0$q8~7i7CixV zW&tGx2cuH~g-k)jTmymvf!FOP77srNhoFzF^pub;%9BE{=Aj?O(BLlmL1t=97p)Kx zL~TW3s8&P}o)v{LS%S?HaWsU31u2BkPm*Xcxuk*1EQCI}xI*aIKqEAPVgfp;sBpk7 z*f_A;3+$l9k-!dlX>4D%B+P>o(02_8bdUfCU-$t^6M`owy@_kUSKRQ3RoJPaBWE&`59f_qDYthyq|rq6&!z;CnzBq<=P49K=Cfh;@7ut$W2_~GjQQi8F@orsuP zMh8UTnj)|=8m&J+wM3r{+|{XN92f;$$6v}ggbZr_T2gSmpk``G#XSHuKgxLY&X1;+ zpuKp|Io=J+!GJ7JXM$+s4U>OXmBFL7_=UYfZCLL0vJCM$Q%8dHOd6%62ZCh;9Ny; z1^V3ZKo1C7D7aq~;J~+SPN`e?b>|dLg=DDA)%cyI>#5B(&N45#}L@CsNhPWLXt)9n!vpPOZ!^+5_RO5pQ!FN3N!0v=D6 zMx;cS&CEkc?n0)D`l#~|Q^_yLF?Vlbsf?SMua_zFbq&k=0Ghyz%Kg_^~L_P<1w70A1%F?cqVqKE{G}&D0sM}jL(xQ zM0g?!2#@%c58f6a5ahu-MT9Z&D2`~)S?xl!6@)SLwy*_w2_R=GSppFk0oxQsjP`>512Ag}+ttTd>4L>xK^3 zG=JAoyEk`c9af%ghMW}%qYe@_v{rLZKE!DmhN3o@K- zPOPOk1%>W=M77*+w~(pQk=$|6u)9E`=iJ8<`O8HoBl!2u@sqc0KbjrktoiMd^$M3+ zYc9?0ENay0;1`|!9MJBczEow``VEaP{no4#L)V;YWSrYIO7e%3aEmI|DJq3Lo%uVi zRdQ+8DG{^oKob(LS~;bMKm>a88xNlfdL$VEn_=D5=Lo4FN3AoybpUZf56cSKAXW!Chy__6(M1PLLSF0V zfH{Hy9X3dDT22W;vGLJb&S3%3WFO9s!R_%huuPh1uukQntrk@vO^SZhOs-DD>5* zN%PS5%c93JbHx^~K6iGBZF$bhPvYYJ`=)KbD|5+L>?4IdYIi{@qhL*5iR`{%Vz3i+41v4z}G)M(0&oa8UIl9O5e$!Z4S#!G$AxwHlA*0OVqJv4MVar9I zd%61?nua?LJn`XlMTue!Y%QWvdm?+t1&tgCmcj3*SQ#AVi>aXY5;WSf(=lhc`7 ztKD3l3yW)Q+oX0N!7D^7;Z&NkjA{OYfde8>;tt;WQ&AJ|cPRZi?$29SLQd=mVbTKD z7~h_O*CQp&PdX^95%j4ZJCi}MA=huFaIgd$uKn3^>JmD z=e0hL%K4JrR3{z60IpDoS+H zm%F)FUN63D)tS^8k!!3txJ`}Q8aS{Xsp`Ab{&rc`^e@&02v0N_;R*W->;lPe+RiS_ zs1bj8SpI)bx6aYgz-WNyJ1iKTYlF1d3GpDB8V2UyNy`B20|Q}F5IPHCp_aiIV?hQ1 zu>Wz(#UuQqIUu0s0Blf0b*_5!bF7S-;o;t>KX@|sw8pn5JZ6@f&zKwjY=zSwCq1cP z*XA)(yGqgw-a9PIok^e5%8Cly;L^BH`tbDGneFcyiCNn}_>Oisw`|Mb)O2=c{2X5u zy%T@x>M`dOvz8d&Sbrq1Ms0RwRq#tc%~gYXHYL8Bhvsf>514+DAcl?8ju z9I2Ui>NYDs*zfSJu&#;Ak0|aMxV?Fs#H2YK0p{=-A|oOW{Xs=M_AciX`}eoTX!?%} z6bM3+8YHkGI01Ny7C1H{fll|*Lg;O>5a}Otzc4}sCg3k-E_VI`0(qy!DFtDN!RM8i z$epvZX~+tJnFE#xapc?cZL@5k6#~}kAI%(Q<6>f?0}}!SmI&xA&|09ZKa8C(LiMFk zFk|O4Y21LZb4HvHhe;k7JM({L?2G~?E!{u4e>{?2iVCkKlwO3S=OgL4KRU^fh@@vA zizeX+cqQsTgF}sXV01v7QA{kz)5RtQ#Kakf#z!KHf82n8&@?Do>R@Gnz9--Z+;d;B z#~F3g(Ki5+0EfOgfWA+GzU_eSp^wKIYN`J+p<>oIft9B?@H+ z1M+s87p8P2N$xxsP2*)3wR7$K+EgcE)FH zf7h-<;Lbh2MdtLuDq+dJBcY!|4GZ{l7tIa#unEu<4~tq+T=*#C-PxQm?z{(IO*)$C zucPMFJg(Ip>9{{Ot#-FwQL+6rQ;D}?*|#-YDJnyw7v^90+<(l5MY>2jfAMh5~)dP%+vik3geSE7_wnumHT6s~&EAIgILr>9to6JNK z!LRTfNzha{%MxKgEi-@`IWtEJV|NR;op)<&oxIzuDaqJCoh%kbdAiLUW)Lh?*$7* zB)#B2ZMgo+W#N?ND?hyk0TU2hD2fxwl0Teyu$%>pzn_a+3Gy`HfBxhZ5u=|M3Xx|C zY3)*xA%=)YJ~O+pc1wvwd2?)Mh}Wi8!lE~Uj*P3P?e8PzQ!bYz(+~<@Ax#dv41p?I zEKoUgbsUU~FH=neUrYM;4*68I0}C@D9v(N-y<0M(ZeX6f*v^W<K zu6AAyT=?ASmB@5wm*~2Xx;v(}{#jA{H-G&{+!+T{s&_y4n72-U z#ny$)=UVcAe#ts--#0HJ{KKu!fm`Q#XD1}dXsC~G+2mm`7;`+!qt@`k&A^@e9~=AX zr&gOZw$;c~T(Zs!d%sZg^+4x?X8-FFMO$X}Omxgjk_)yb9x}M`v|!?pvr)ozLs8>} zlwxmE-f_QCT z`TKX-Hg~5u5AJxrKYFZ*LL>w%EbhE1KC3`xWjtklgr_{`N9PiWcrs5}5!A{4 z7$G!@p-ez{N)rS;@gJiYJp6JIiOHux1_UyAcx%wNmcXPf22V4*b>?ys5&t(43(ZRj z<6E|GCh4t|n4VX4?aZI9)o))7XllT~ZV;?gcGG7N0x zAnPF7g45MqL;b)u3@uj|7cGv9!vYH1k~W`a&Z5lcvcckS4l)}(k0`J9^R}*GkwNoa z;{76Hv|NH>*MtQG@p-aqfnTl*{Br4^@f!S*t2-@TNsJP!(HIo|$kYcLjn}OIw{!$- z8Bt#SZzYD&8U#jbSYWsi3Ym`i1D>Yg;p8V zAcVAQp^=P&>CigoFU{4K{*uaU-evP|S})dZ=+#!usz^BJE+R--r1E}9u4kC`abWV zQfVDksIArQhfiv^_{?vihovW_hk~-Dp`DuNyl~}Wp*x8%krSo5q z>`Rqf%Y;1M+pfPed&%Rfz_vToh2L9gIhA?wcb0hUu?iZtiMbqTYf|tf+h1z#D&;G> zPP>);RoWgkD;)MZWX-o}k=bV+nsab){)Di9p@c)5d;SNfsL_aJALoA=h&-`{S}J4DG*I=X_?6#rU2dL@5i$iewq`QH zk4|1*8vQA3bKH_;>xz^!uG+C)lhzRaki_ji9hscma3oT zn3$Rn;wa0~9Jcy%B1U58IrZi(#u<9qhaP2h)-LZe`nrFRkp!iQ;9Quc`w}?-%gu;K>ek; zxzOXK$Uc69rm)W*xzlTJ%igZ(TxsX4;zlHkI=s52AKBVEl$9RU$@K_tC^faNopb12 z?ZWFhX33d~6FJUp-6q`YyC{_s@z;4zPwGrxR;b56X1lUm-;t`UP8l{mwP~5n$cDa+ z6}7j+-Cd*3iio7U?E^BsAYvlwIcT7HNIs?G=Ms_lRss3M*4A*C5>CX;{}jlT9V#;|u)K zxWH7d2BvcPPg99gyf7TTpRm^keAyNFr})cL^FJq+C9sHA|^?zmH9t~F54Ihi0DUo!by+=E#d0IE`=C@b-L`A!*A{-JfU!}W`<2OVs85n9l zWv0B6`rXU%Qt*cYm(?qVQkSflIB6WRkvm)R_;&dliIlT4Dojd5@HfdB{ zM?IY8nYv9zt;Bia#8dw{_f|>Y@P0S3!{x^9mm8PazrNqJ{oupgoO+hQ(tXcj!lbSm z&yU$bzD(C^et2w?cI&{EoYdp4IrlybyA?-FIPj|^qba=xD@stZo;)TU)p`S?AzbU zwNg^Q_U-5NpNKWOo8p_+c=wM~it2{<9pZCm>q#igDmpPku$lOmAN#J~uzV_mtBoiEO_yV-dParq$hhGdjQ3 z-%`5}KJMkb)LZWEoW@!w;pB)5vg)y~w|{bO+o-(j>_Wx6s*FowiYklNR&!3g*VyE9 zCuhG>Y}mz`bqx(>tA-2@Pa3%Uz`*q(azA1&Ad&@s2n{5CfWP}Ax!V3}P;3RpC=|9gQQOEj?K90cA73yY7A zO~L{@;MeZZbktwX&i|7bTle^~_ME2&y!=BuP4jnp_FUhi(uOP(SaC-LB$N0cne-#m z^WTiIp~)mUI_m2N%`oxTGiCfCo zxrYZ0G(+%YZO_5|v9@2UqMv&yoG^2+3S4_cWLJ?XnR=YnbAGk)qC0^R>pK!yk*B4} zkIv_OiRdiLSDE$dS#Zb#7yJ9gjVCnL_8J@RtKu!g5$lA{WIqiXXcT|7u76eZ8U6OC z-bL04_&${fkvz%wk+WSNt#wJzc0YB$bZm#|#j()-pz(vt{`gRELeEXNL%Vq~zh(Lf zIXPKxQ{92Zh0H@AKIvz-HYwM+ZZtpoRdWB<>Dj}h606eBr%yMZ?wqj2_`G_nU!0*q z_`0Y?2I6ZKp5@k8dG_1<7BAWKGB>Tu^vM#lU=zpFS)VDYeTDCG#&hxG*DuC@8@G#% zmZ?raF3{?ddz~go9`_e7yyO~L5)f}~aKyoC{y7Dq)h&Uaw9mvvUfm(yd=&3);~Ll( z*Rw&x(-Oa9#q`{8snUab_d=%YX*V)$_e6b}=^DO@BWqRlrlIEY(`+BdlCBQBHOJju z#gByHEmPN*`9;J{kWRm32b+d{Yd^=fNlo2#rv0PIqXxy6W7o~f$xAbvS_tQO2i7U8 zD`szxnHWCap{JTHkz;(P(eBgU@1$q6kJ|K*c>_`>pKRNGdvMnCQC)M>Ir&fG<2_e( z?l&7r<&&u?P3_OtwJ>8WJ9oahT)kk+0x|y$eK7$p_S;|aBFlwk&aD<%C38&Ojp}i< zEGGDE8IN!atba_=$Q1~wl>P5rjUSjz0&N6ev^Z}Xk)TRc#Ek?VIdhO0G3|A`VY5RD zvS=sw(mXy0F{h^;O#Khr>nU3}!0*=*gmJ_3^!FpPRHT8UkA+dlEbzVnbH$GeV_1R2 zBMW}UY=rP+17t2jf;RvuD?}6&1cGeKFqXz3V(4)pvt|g#*JbncJ&xrUeT4j@;@mc(-6AO@+n4XSPZ4aqk^>(RhLW9Km(AT^mH{K^sO2n6$^|co5pX*}3 zA6+e{;Iyrkyy!UVWLT(t@r@U;>*YKeE^jnr7GAjGQBZRKipS&QAtTP>T6VKDzUW2Z+>$qG{;r@gLQ1_rDyE$z^Ms@j zo{%^ek=^y59ZoDB`*&fVsqt7IehH%bBWec%vQmGE%l$*lHThd%klcM{-BrGW;blXg zThGUieDsN{%|2ApU3A4uO$bTw zIyLgyZH=0`>z%Fg`9pepX*VK}^y2>kdhquh2LjH7;OFYwHr2ZvXrKAM?QOIwJ?YTh z3sZiwTLS;=M%4@ip7%IFRL!uMTS;W#q)_t2TopSE58rs0`cq;QQ<+qK-&ArU^`-r4T|$g?Vs553K#D+SBlvemqt zWazZ9UB%%}j_*6UtcCd(TL(y-eGzd=Gjlf1(Kx2}Xnj`jwfA1jqC*SJR`PlB+@{=b kTk$?Z-yW`rJQuy(A>dl_`5{Hxj*Dyk1~qOzkf_A{ALQ^OGynhq literal 0 HcmV?d00001 diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Images/dotnet_bot.svg b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Images/dotnet_bot.svg new file mode 100644 index 0000000..abfaff2 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Images/dotnet_bot.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Raw/AboutAssets.txt b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Raw/AboutAssets.txt new file mode 100644 index 0000000..15d6244 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Raw/AboutAssets.txt @@ -0,0 +1,15 @@ +Any raw assets you want to be deployed with your application can be placed in +this directory (and child directories). Deployment of the asset to your application +is automatically handled by the following `MauiAsset` Build Action within your `.csproj`. + + + +These files will be deployed with you package and will be accessible using Essentials: + + async Task LoadMauiAsset() + { + using var stream = await FileSystem.OpenAppPackageFileAsync("AboutAssets.txt"); + using var reader = new StreamReader(stream); + + var contents = reader.ReadToEnd(); + } diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Splash/splash.svg b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Splash/splash.svg new file mode 100644 index 0000000..21dfb25 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Splash/splash.svg @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Colors.xaml b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Colors.xaml new file mode 100644 index 0000000..245758b --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Colors.xaml @@ -0,0 +1,44 @@ + + + + + #512BD4 + #DFD8F7 + #2B0B98 + White + Black + #E1E1E1 + #C8C8C8 + #ACACAC + #919191 + #6E6E6E + #404040 + #212121 + #141414 + + + + + + + + + + + + + + + #F7B548 + #FFD590 + #FFE5B9 + #28C2D1 + #7BDDEF + #C3F2F4 + #3E8EED + #72ACF1 + #A7CBF6 + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Styles.xaml b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Styles.xaml new file mode 100644 index 0000000..dc4a034 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Resources/Styles/Styles.xaml @@ -0,0 +1,405 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IGetThumbnailApi.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IGetThumbnailApi.cs new file mode 100644 index 0000000..48eb920 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IGetThumbnailApi.cs @@ -0,0 +1,11 @@ +using LambdaTriggers.Common; +using Refit; + +namespace LambdaTriggers.Mobile; + +[Headers("Accept-Encoding: gzip", "Accept: application/json")] +public interface IGetThumbnailApi +{ + [Get($"/LambdaTriggers_GetThumbnail?{Constants.ImageFileNameQueryParameter}={{photoTitle}}")] + Task GetThumbnailUri(string photoTitle, CancellationToken token); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IUploadPhotosApi.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IUploadPhotosApi.cs new file mode 100644 index 0000000..2948803 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/IUploadPhotosApi.cs @@ -0,0 +1,11 @@ +using LambdaTriggers.Common; +using Refit; + +namespace LambdaTriggers.Mobile; + +[Headers("Accept-Encoding: gzip", "Accept: application/json")] +public interface IUploadPhotosAPI +{ + [Post($"/LambdaTriggers_UploadImage?{Constants.ImageFileNameQueryParameter}={{photoTitle}}"), Multipart] + Task UploadPhoto(string photoTitle, [AliasAs("photo")] StreamPart photoStream, CancellationToken token); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/PhotosApiService.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/PhotosApiService.cs new file mode 100644 index 0000000..e7ef659 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/Services/PhotosApiService.cs @@ -0,0 +1,20 @@ +using Refit; + +namespace LambdaTriggers.Mobile; + +class PhotosApiService +{ + readonly IUploadPhotosAPI _uploadPhotosApiClient; + readonly IGetThumbnailApi _getThumbnailApiClient; + + public PhotosApiService(IUploadPhotosAPI uploadPhotosApiClient, IGetThumbnailApi getThumbnailApiClient) => + (_uploadPhotosApiClient, _getThumbnailApiClient) = (uploadPhotosApiClient, getThumbnailApiClient); + + public async Task UploadPhoto(string photoTitle, FileResult photoMediaFile, CancellationToken token) + { + var fileStream = await photoMediaFile.OpenReadAsync().ConfigureAwait(false); + return await _uploadPhotosApiClient.UploadPhoto(photoTitle, new StreamPart(fileStream, $"{photoTitle}"), token).ConfigureAwait(false); + } + + public Task GetThumbnailUri(string photoTitle, CancellationToken token) => _getThumbnailApiClient.GetThumbnailUri(photoTitle, token); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/Base/BaseViewModel.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/Base/BaseViewModel.cs new file mode 100644 index 0000000..d449207 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/Base/BaseViewModel.cs @@ -0,0 +1,5 @@ +namespace LambdaTriggers.Mobile; + +abstract partial class BaseViewModel : ObservableObject +{ +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/PhotoViewModel.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/PhotoViewModel.cs new file mode 100644 index 0000000..5177b94 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.Mobile/ViewModels/PhotoViewModel.cs @@ -0,0 +1,97 @@ +namespace LambdaTriggers.Mobile; + +partial class PhotoViewModel : BaseViewModel +{ + readonly WeakEventManager _eventManager = new(); + + readonly IDispatcher _dispatcher; + readonly IMediaPicker _mediaPicker; + readonly PhotosApiService _photosApiService; + + [ObservableProperty, NotifyCanExecuteChangedFor(nameof(UploadPhotoCommand))] + bool _isCapturingAndUploadingPhoto; + + [ObservableProperty] + Stream? _capturedPhoto; + + [ObservableProperty] + Uri? _thumbnailPhotoUri; + + public PhotoViewModel(IDispatcher dispatcher, IMediaPicker mediaPicker, PhotosApiService photosApiService) + { + _dispatcher = dispatcher; + _mediaPicker = mediaPicker; + _photosApiService = photosApiService; + } + + public event EventHandler Error + { + add => _eventManager.AddEventHandler(value); + remove => _eventManager.RemoveEventHandler(value); + } + + bool CanUploadPhotoExecute => !IsCapturingAndUploadingPhoto; + + [RelayCommand(CanExecute = nameof(CanUploadPhotoExecute))] + async Task UploadPhoto(CancellationToken token) + { + CapturedPhoto = null; + ThumbnailPhotoUri = null; + + try + { + var storageReadPermissionResult = await _dispatcher.DispatchAsync(Permissions.RequestAsync); + + if (storageReadPermissionResult is not PermissionStatus.Granted) + { + OnError("Storage Read Permission Not Granted"); + return; + } + + var storageWritePermissionResult = await _dispatcher.DispatchAsync(Permissions.RequestAsync); + + if (storageWritePermissionResult is not PermissionStatus.Granted) + { + OnError("Storage Write Permission Not Granted"); + return; + } + + var cameraPermissionResult = await _dispatcher.DispatchAsync(Permissions.RequestAsync); + + if (cameraPermissionResult is not PermissionStatus.Granted) + { + OnError("Camera Permission Not Granted"); + return; + } + + IsCapturingAndUploadingPhoto = true; + + var photo = await _dispatcher.DispatchAsync(() => _mediaPicker.CapturePhotoAsync(new() + { + Title = Guid.NewGuid().ToString() + })).ConfigureAwait(false); + + if (photo is null) + return; + + ThumbnailPhotoUri = null; + CapturedPhoto = await photo.OpenReadAsync().ConfigureAwait(false); + + await _photosApiService.UploadPhoto(photo.FileName, photo, token).ConfigureAwait(false); + + ThumbnailPhotoUri = await _photosApiService.GetThumbnailUri(photo.FileName, token).ConfigureAwait(false); + + await Task.Delay(TimeSpan.FromSeconds(2), token).ConfigureAwait(false); + } + catch (Exception e) + { + OnError(e.Message); + } + finally + { + IsCapturingAndUploadingPhoto = false; + } + } + + void OnError(in string message) => _eventManager.HandleEvent(this, message, nameof(Error)); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/LambdaTriggers.UploadImage.csproj b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/LambdaTriggers.UploadImage.csproj new file mode 100644 index 0000000..0918697 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/LambdaTriggers.UploadImage.csproj @@ -0,0 +1,36 @@ + + + Exe + net7.0 + enable + enable + Lambda + bootstrap + + true + + + true + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/Properties/launchSettings.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/Properties/launchSettings.json new file mode 100644 index 0000000..5870340 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/Properties/launchSettings.json @@ -0,0 +1,10 @@ +{ + "profiles": { + "Mock Lambda Test Tool": { + "commandName": "Executable", + "commandLineArgs": "--port 5050", + "workingDirectory": ".\\bin\\$(Configuration)\\net7.0", + "executablePath": "%USERPROFILE%\\.dotnet\\tools\\dotnet-lambda-test-tool-7.0.exe" + } + } +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/UploadImage.cs b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/UploadImage.cs new file mode 100644 index 0000000..31a9bc1 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/UploadImage.cs @@ -0,0 +1,63 @@ +using System.Net; +using System.Text.Json; +using Amazon.Lambda.APIGatewayEvents; +using Amazon.Lambda.Core; +using Amazon.Lambda.RuntimeSupport; +using Amazon.Lambda.Serialization.SystemTextJson; +using Amazon.S3; +using HttpMultipartParser; +using LambdaTriggers.Backend.Common; +using LambdaTriggers.Common; + +namespace LambdaTriggers.UploadImage; + +public sealed class UploadImage +{ + static readonly IAmazonS3 _s3Client = new AmazonS3Client(); + + public static async Task FunctionHandler(APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context) + { + if (request.QueryStringParameters is null + || !request.QueryStringParameters.TryGetValue(Constants.ImageFileNameQueryParameter, out var filename) + || filename is null) + { + return new APIGatewayHttpApiV2ProxyResponse + { + StatusCode = (int)HttpStatusCode.BadRequest, + Body = request.QueryStringParameters?.Any() is true + ? $"Invalid Request. Query Parameter, \"{request.QueryStringParameters.First().Value}\", Not Supported" + : $"Invalid Request. Missing Query Parameter \"{Constants.ImageFileNameQueryParameter}\"" + }; + } + + try + { + var multipartFormParser = await MultipartFormDataParser.ParseAsync(new MemoryStream(Convert.FromBase64String(request.Body))); + var image = multipartFormParser.Files[0].Data; + + var photoUri = await S3Service.UploadContentToS3(_s3Client, S3Service.BucketName, filename, image, context.Logger); + context.Logger.LogInformation("Saved Photo to S3"); + + return new APIGatewayHttpApiV2ProxyResponse + { + StatusCode = (int)HttpStatusCode.OK, + Body = JsonSerializer.Serialize(photoUri) + }; + } + catch (Exception ex) + { + context.Logger.LogError(ex.Message); + + return new APIGatewayHttpApiV2ProxyResponse + { + StatusCode = (int)HttpStatusCode.InternalServerError, + Body = JsonSerializer.Serialize(ex.Message) + }; + } + } + + static Task Main(string[] args) => + LambdaBootstrapBuilder.Create((APIGatewayHttpApiV2ProxyRequest request, ILambdaContext context) => FunctionHandler(request, context), new DefaultLambdaJsonSerializer()) + .Build() + .RunAsync(); +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/aws-lambda-tools-defaults.json b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/aws-lambda-tools-defaults.json new file mode 100644 index 0000000..9c10992 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.UploadImage/aws-lambda-tools-defaults.json @@ -0,0 +1,28 @@ + +{ + "Information" : [ + "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", + "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", + "dotnet lambda help", + "All the command line options for the Lambda command can be specified in this file." + ], + "profile" : "VisualStudioToolkit", + "region" : "us-west-1", + "configuration" : "Release", + "function-runtime" : "provided.al2", + "function-memory-size" : 256, + "function-timeout" : 30, + "function-handler" : "bootstrap", + "msbuild-parameters" : "--self-contained true", + "framework" : "net7.0", + "function-name" : "LambdaTriggers_UploadImage", + "function-description" : "", + "package-type" : "Zip", + "function-role" : "arn:aws:iam::723361041013:role/lambda_exec_LambdaTriggers-0", + "function-architecture" : "x86_64", + "function-subnets" : "", + "function-security-groups" : "", + "tracing-mode" : "Active", + "environment-variables" : "", + "image-tag" : "" +} \ No newline at end of file diff --git a/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.sln b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.sln new file mode 100644 index 0000000..d9ff99a --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/LambdaTriggers.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33213.308 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.GenerateThumbnail", "LambdaTriggers.GenerateThumbnail\LambdaTriggers.GenerateThumbnail.csproj", "{170009F9-B173-4896-BA10-C510C1E4BAF3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.UploadImage", "LambdaTriggers.UploadImage\LambdaTriggers.UploadImage.csproj", "{B6E24922-FB57-4089-8140-E508D75018B2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Backend", "Backend", "{5CD827CF-5A01-4CDE-BAC5-A2CD3CC6194A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.Mobile", "LambdaTriggers.Mobile\LambdaTriggers.Mobile.csproj", "{EC4A1A6B-34F4-44F1-85C8-C95197D854E6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.Backend.Common", "LambdaTriggers.Backend.Common\LambdaTriggers.Backend.Common.csproj", "{CD869696-DCE3-4AD1-B8B4-853E48A95F86}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{31DC17FF-7664-4437-BAD4-949626A85F75}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile", "Mobile", "{4E8C7AA8-81D4-4DF5-A8B2-E935BC6212D7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.Common", "LambdaTriggers.Common\LambdaTriggers.Common.csproj", "{736602EF-FBDF-48AF-BF16-85C564653846}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LambdaTriggers.GetThumbnail", "LambdaTriggers.GetThumbnail\LambdaTriggers.GetThumbnail.csproj", "{41567193-4BFB-46A7-9776-50CE6E2E9112}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {170009F9-B173-4896-BA10-C510C1E4BAF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {170009F9-B173-4896-BA10-C510C1E4BAF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {170009F9-B173-4896-BA10-C510C1E4BAF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {170009F9-B173-4896-BA10-C510C1E4BAF3}.Release|Any CPU.Build.0 = Release|Any CPU + {B6E24922-FB57-4089-8140-E508D75018B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B6E24922-FB57-4089-8140-E508D75018B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B6E24922-FB57-4089-8140-E508D75018B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B6E24922-FB57-4089-8140-E508D75018B2}.Release|Any CPU.Build.0 = Release|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Release|Any CPU.Build.0 = Release|Any CPU + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6}.Release|Any CPU.Deploy.0 = Release|Any CPU + {CD869696-DCE3-4AD1-B8B4-853E48A95F86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD869696-DCE3-4AD1-B8B4-853E48A95F86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD869696-DCE3-4AD1-B8B4-853E48A95F86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD869696-DCE3-4AD1-B8B4-853E48A95F86}.Release|Any CPU.Build.0 = Release|Any CPU + {736602EF-FBDF-48AF-BF16-85C564653846}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {736602EF-FBDF-48AF-BF16-85C564653846}.Debug|Any CPU.Build.0 = Debug|Any CPU + {736602EF-FBDF-48AF-BF16-85C564653846}.Release|Any CPU.ActiveCfg = Release|Any CPU + {736602EF-FBDF-48AF-BF16-85C564653846}.Release|Any CPU.Build.0 = Release|Any CPU + {41567193-4BFB-46A7-9776-50CE6E2E9112}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {41567193-4BFB-46A7-9776-50CE6E2E9112}.Debug|Any CPU.Build.0 = Debug|Any CPU + {41567193-4BFB-46A7-9776-50CE6E2E9112}.Release|Any CPU.ActiveCfg = Release|Any CPU + {41567193-4BFB-46A7-9776-50CE6E2E9112}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {170009F9-B173-4896-BA10-C510C1E4BAF3} = {5CD827CF-5A01-4CDE-BAC5-A2CD3CC6194A} + {B6E24922-FB57-4089-8140-E508D75018B2} = {5CD827CF-5A01-4CDE-BAC5-A2CD3CC6194A} + {EC4A1A6B-34F4-44F1-85C8-C95197D854E6} = {4E8C7AA8-81D4-4DF5-A8B2-E935BC6212D7} + {CD869696-DCE3-4AD1-B8B4-853E48A95F86} = {5CD827CF-5A01-4CDE-BAC5-A2CD3CC6194A} + {736602EF-FBDF-48AF-BF16-85C564653846} = {31DC17FF-7664-4437-BAD4-949626A85F75} + {41567193-4BFB-46A7-9776-50CE6E2E9112} = {5CD827CF-5A01-4CDE-BAC5-A2CD3CC6194A} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {6A9396FE-D752-4780-B5D8-FA52E925D40E} + EndGlobalSection +EndGlobal diff --git a/SampleApplications/2023/LambdaTriggersSample/README.md b/SampleApplications/2023/LambdaTriggersSample/README.md new file mode 100644 index 0000000..6d52291 --- /dev/null +++ b/SampleApplications/2023/LambdaTriggersSample/README.md @@ -0,0 +1,13 @@ +# Lambda Triggers Sample + +A sample app demonstrating an end-to-end mobile workflow using [.NET MAUI](https://learn.microsoft.com/en-us/dotnet/maui/?view=net-maui-7.0), + [Serverless AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-csharp.html) + [AWS S3 Storage](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/csharp_s3_code_examples.html) in C#. + +This sample demonstrates how to use AWS Lambda's [HTTP API Gateway Triggers](https://aws.amazon.com/blogs/developer/deploy-an-existing-asp-net-core-web-api-to-aws-lambda/) + [S3 Triggers](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html) to automatically generate thumbnails of an uploaded image from a mobile app. + +1. The .NET MAUI mobile app captures a photo +2. The .NET MAUI mobile app uploads photo to AWS via an AWS Lambda using an API Gateway HTTP trigger +3. The AWS Lambda API Gateway Function saves the image to AWS S3 Storage +4. An AWS Lambda S3 Trigger automatically generates a downscaled thumbnail of the image and saves the thumbnail image back to S3 Storage +5. The .NET MAUI mobile app retrives the thumbnail image via an AWS Lambda using an API Gateway HTTP trigger and displays it on screen + +![](https://user-images.githubusercontent.com/13558917/214541434-0244c7f0-cc13-4273-89b0-af5ffd9f9786.png)