Skip to content

Upload Process

Seán Lynch edited this page May 6, 2023 · 10 revisions

PhotosController@store

Currently being refactored to Uploads\UploadPhotoController

1. Verification

  • Request Verification

    • The file should be an image
  • Check for GPS

    • We extract the EXIF data and check it for GPS keys.
      • If no GPS keys are found, a 500 error is thrown and the process is aborted.
    • We then test for empty "0/0" values, which we believe can be introduced when transferring images across devices.
      • If no GPS values are found, a 500 error is thrown with this information.
  • Check For Duplicates

    • We check the dateTime the image was taken at.
    • The user will get an error if they try to upload the same photo twice.

2. Upload the Photo

Actions Used

  • UploadPhotoAction x2
    • We use AWS S3 on production, DigitalOcean on staging, and public/local-uploads/ locally.
    • Creates the filepath in year/month/day/fileHashName.jpg format.
    • Uploads the photo.
    • We duplicate the upload with a resized image of 500x500 dimensions for the OpenLitterAI.
      • This should be done asynchronously after everything else has been done.

3. Get GPS & Check For Locations

  • Convert EXIF values to lat/lon.

  • Reverse Geocode the coordinates at OpenStreetMap to get an address.

    • Use OpenStreetMap address values to populate list of locations at OpenLitterMap.
      • If a new location is created, we fire these events: NewCountryAdded, NewStateAdded, and NewCityAdded.
      • These need to move to after the Photo was created.

4. Create the Photo

  • Preprocess
    • Get device model (eg. iPhone 13 Pro / Android Samsung X)
    • Convert the coordinates into a geohash
  • Create the record on the photos table.

5. Update Leaderboards & XP.

  • We need to move the Users XP to Redis.

  • We need daily, weekly, monthly Leaderboards.

6. Dispatch Events & Notifications

  • After everything is done, we should dispatch these last.
    • Image Uploaded

      • AddLocationContributor
      • IncreaseLocationTotalPhotos
      • IncreaseTeamTotalPhotos
        • This data needs to move to Redis
    • Locations Created should move here

    • Increment PhotosPerMonth

      • IncrementCountryMonth
      • IncrementStateMonth
      • IncrementCityMonth
    • We also need PhotosPerDay, per week and more.