Meet up. Clean up. Feel good.
TrashMob.eco is a platform dedicated to organizing groups of people to clean up the world we live in. Users create cleanup events, publicize them, and recruit people to join up, as well as ask for assistance from communities and partners to help haul away the garbage once it is gathered. The idea is to turn what can be an intimidating process for event organizers into a few clicks and simple forms. And once the process is simple, events will spring up all over the world, and the cleanup of the world can begin.
Years ago, Scott Hanselman (and others at Microsoft) built out the NerdDinner.com site as a demo of the capabilities of ASP.NET MVC. I actually went to a bunch of the nerd dinners. They were fantastic and had a huge roll in my career, including eventually leading me to join Microsoft. This site is based on both that code and the idea that getting people together to do small good things results in larger good things in the long term.
My passion is fixing problems we have on the planet with pollution and climate change. I've been thinking about what technology can do to help in these areas, without creating more problems. And I keep coming back to the thought that a lot of this is a human problem. People want to help and they want to fix things, but they don't know where to start. Other people have ideas on where to start, but not enough help to get started.
I read about a guy in California named Edgar McGregor, who has spent over 1100 days cleaning up a park in his community, two pails of litter at a time, and I thought, that was a great idea. His actions inspired me to get out and clean up a local park one Saturday. It was fun and rewarding and other people saw what I was doing on my own and I know I have already inspired others to do the same. And then I passed by an area of town that is completely covered in trash and I thought "this is too much for me alone. It would be great to have a group of people descend on this area like a mob and clean it up in an hour or two". And my idea for TrashMob.eco was born.
Basically, TrashMob is the NerdDinner.com site re-purposed to allow people to start mobs of their own to tackle cleanup or whatever needs doing. And I keep coming up with more and more ideas for it. I'm hoping this site grows organically because of the good that we can do we get together.
To see what is currently deployed to the prod environment, go to: https://www.trashmob.eco
To see what is currently deployed to the dev environment, go to: https://as-tm-dev-westus2.azurewebsites.net/
As of 5/15/2022, we are now in full production launch. The site is up and running and people are using it ot help organize litter cleanups! TrashMob.eco is now a 501(c)(3) non-profit in the United States. We are working on new features all the time!
ABSOLUTELY! Ping info@trashmob.eco if you want to get involved. All kinds of skills are needed, from reactjs to website design, to aspnet core, to .NET MAUI, to PowerBI, to deployment / github skills. If you have a couple of hours a week, and want to contribute, let us know!
Fantastic! We want to build this out to be best platform on the internet! But before you send us your idea, please take a look at the lists of projects and issues we already have going. We may already be working on your idea. If your idea is not there, feel free to reach out to us at info@trashmob.eco
If you are not doing any database changes (i.e. design work, error handling, etc) you can save yourself time and money by doing the following and using the shared Dev environment:
.\setupdev.ps1 -environment dev -region westus2 -subscription 39a254b7-c01a-45ab-bebd-4038ea4adea9
You must use this if you are making database changes to ensure you do not break the backend for everyone else:
.\setupdev.ps1 -environment <yourenv> -region <yourregion> -subscription <yourazuresubscription>
i.e.
.\setupdev.ps1 -environment jb -region westus2 -subscription
## Setting up your launchsettings.json for website development
Because of RedirectUrls, life is a lot easier if you stick with the same ports as everyone else.
cd to the TrashMob/Properties folder:
Add the following launchsettings.json file (may need to create it if you don't have it already):
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:44332/", "sslPort": 44332 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "TrashMob": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, "applicationUrl": "https://localhost:44332;http://localhost:5000" } } }
## Setting up your environment for Docusign Integration Testing
Docusign is integrated with the TrashMob.eco to ensure that a user has signed the appropriate liability waivers before attending a
TrashMob.eco event. If the user has not previously signed a waiver, or the waiver they signed is out of date, they will be asked to
sign a new waiver either when they try to create a new event, or when they sign up for an existing event.
For developers, there are a number of secrets that need to be set up in your environment before you can test with an identity which has not signed the
waiver for testing.
If you are a new developer and have no need to test the Docusign flow, simply sign into the Dev site for TrashMob.eco, and create or register for an event.
When you try to do this, the system will ask you to sign the waivers. Follow the instructions, and then you can begin testing locally without needing the
integration to work. This is, by far, the easiest way to get start on non-docusign features, and is highly recommended.
If you are, however, attempting to test or alter the Docusign workflow, here are the steps you need to take:
1. Create a Developer Account at https://appdemo.docusign.com/home
2. Click on **Settings** in the top action bar
3. Click on Integrations / Apps and Keys in the Left Action Bar
4. This should bring you to a page with "My Account Information" at the top.
5. Click Add App and Integration Key
6. Set the App Name
7. Set the RedirectUrl to https://localhost:44332/waivers
8. Open Visual Studio Code and a terminal window within
9. cd trashmob
10. Set the following user secrets using dotnet user-secrets set with the following names / values
| Secret Name | Where to get the value |
| --- | --- |
| DocusignAccountId | API Account Id under My Account Information |
| DocusignImpersonatedUserId | Use Id under My Account Information |
| DocusignClientId | Integration Key from the Apps and Integration Keys section |
| DocusignAuthServer | account-d.docusign.com |
| DocusignPrivateKeyEncoded | Click the Actions pull down under apps and integration keys, and click edit. Then under service integration, click generate RSA. Copy the value for PrivateKey. Then you need to base64 encode this value before setting that as a secret |
| DocusignBasePath | https://demo.docusign.net/restapi |
| DocusignRedirectHome | https://localhost:44332/waivers |
11. Set a breakpoint in the DocusignManager.SendEnvelope method
12. Start the code in the debugger
13. Log in to TrashMob via the debugger browser
14. Click "Create an Event"
15. When the breakpoint is reached, step until you get into the catch handler after AuthenticateWithJWT call
16. Step into the if statement and get the value for the url that is created.
17. Open a browser, and paste that Url into the browser.
18. Accept the consent as instructed in the window.
19. Close the browser
20. Restart your debugger session
21. You should now be able to go through the regular Docusign Waiver form flow.
## Getting Started - Mobile Development
The mobile app is written using .NET MAUI. It requires a few prerequisites in order to get it compiling and running.
### If you are working on a Windows machine:
1. Ensure you have installed the latest version of Visual Studio and the .NET MAUI Framework option
1. Install Android Studio https://developer.android.com/studio
1. Create an Android Emulator device in Android Studio
1. Load the TrashMobMobileApp.sln Project in Visual Studio.
1. Set your startup project to TrashMobMobileApp
1. In order to have the maps feature work, you will need to do one of the following options:
1. Create your own key
1. Create a Google Maps account: https://developers.google.com/maps/gmp-get-started
1. Get your Google API Key from your Google Project
1. Open the Platforms/Android/AndroidManifest.xml file
1. Paste your GoogleMaps key to the value of the following line:
```xml
<meta-data android:name="com.google.android.geo.API_KEY" android:value="<insert your api key here>" />
1. Get the dev key from the dev keyvault
1. See if you have read access to the following keyvault secret: https://portal.azure.com/#@jobeedevids.onmicrosoft.com/asset/Microsoft_Azure_KeyVault/Secret/https://kv-tm-dev-westus2.vault.azure.net/secrets/Android-Google-ApiKey-Dev
1. If you don't have access, send a message to the team contact
1. If you do have access copy the value there
1. Open the Platforms/Android/AndroidManifest.xml file
1. Paste your GoogleMaps key to the value of the following line:
```xml
<meta-data android:name="com.google.android.geo.API_KEY" android:value="<insert your api key here>" />
```
<b>Never check in any file that contains the api key!!!!!</b>
az login
command to login to Azuredotnet run --environment Development
In the Trashmob project folder, run the following command:
dotnet build
In the Trashmob project folder, run the following command:
dotnet run
or if using Visual Studio, set the TrashMob project as the start up project and hit F5.
If a browser does not open, open one for yourself and go to https://localhost:44332
If the app loads, but data does not, it is likely that the firewall rule is not set up correctly. Sometimes the IP address the Web Portal displays is different from the IP address of your machine. If you run into this issue, look in the debug window of VSCode. It will report a failure, and show that your actual IP Address is not enabled to access the database.
As the site's feature set has grown, so have the scenarios that need to be tested after large changes have been made. Please see the Test Scenarios document for a list of checks that should be run. At some point we will need to automate these tests.
The project uses Entity Framework Core V8 Model-First database updates.
In VS Code
dotnet ef migrations add <YourMigrationName>
or in Visual Studio Package Manager Console
First, set the Default Project to TrashMob.Shared, then run the following command:
EntityFrameworkCore\Add-Migration <YourMigrationName>
dotnet ef database update
This is a pay-per-use feature, so, for the most part, we're going to try to limit the number of people developing with this. To not send email, make sure to set the following user secret on your dev box
dotnet user-secrets set "sendGridApiKey" "x"
To test sending email, copy the "sendGridApiKey" from the dev keyvault to your machine and repeat the above, substituting in the real key.
The call to find the distance between two points in Azure Maps is only available in S1 (Gen 1) or Gen2 Maps. This is significantly more expensive than the S0 maps, so for now, we default to S0 for all dev deployments, and have manually set Prod to Gen2. It is not recommended to rerun the infrastructure deployments to Prod, as this will overwrite this setting.
In the future, we may want to optimize the use of this function to reduce costs.
The Dev site is automatically deployed with each push to the Main branch via a GitHub action. This is the preferred method of updating the Development Server. If you need to push an update from your development machine instead, please let the team know that there are changes in the environment pending checkin.
The Production site is manually deployed via a GitHub action from the release branch. This is the ONLY way production should be updated.
Use Visual Studio Publish to publish the site to the dev server.
If setting up a new environment, you will need to add the IP Address of the App Service to the list of IP Addresses accessible in the SQL Server. This needs to be automated in the future to make sure that a change to an IP address doesn't break the site.
If you try to access a secure page, you will need a user id on the site. When you hit a secured page, the site will redirect you to a sign in page. Click the Sign up now link at the bottom of the login box. Multiple identity providers are now available, including Facebook, LinkedIn, Google, and Microsoft, along with the TrashMob tenant itself if you prefer not to use an integrated signup.
It is currently hard-coded in the Mobile app that if you run a Debug build, you will point to the test environment, and if you run the release build, you will point to the production environment.
The Release build is the one that is published to the app stores. We are working on having a second app store entry for testing only.
In Debug mode, by default, the Android package format is set to apk, and does not build the bundle needed for signing. In order to change that
Note: this may make deployments to your local emulator slower (more data must be copied into the emulator session). You can change this back to "apk" for local development, but failure to switch it back to "bundle" before checkin will cause the PR build to fail. There may be a way to pass this setting in on the command line for the publish step. That has not yet been investigated.
The production mobile app can be downloaded here:
IFTTT.com testing is currently in progress. There are a couple of steps needed to get this working.
Every year, the SSL certificate for the TrashMob.eco site will need to be updated. The process for updating the certificate is stored in the TrashMob.eco OneNote under "Renewing the SSL Certificate".
keytool -export -rfc -keystore your-upload-keystore.jks -alias upload-alias -file
keytool -export -rfc -keystore your-upload-keystore.jks -alias upload-alias -file
TBD
TBD
When needing to update the major and minor versions of the app, we need to push a new Tag to the repository. This is done by the TrashMob team, and not by individual developers. The steps are as follows:
git tag x.y
git push origin --tags
Note that the Main and Release branches have different tags. The Main branch is for the Test environment, and the Release branch is for the Prod environment. To update the Release branch, you must be on the Release branch, then do the following command:
git tag x.y release
git push origin --tags
Deploying the mobile app to the app stores is a multi-step process.