Local free events in New York City.
Built with AWS Amplify & AppSync. Uses ElasticSearch, DynamoDB, NodeJS, React, and the Google Maps API.
Initially started because I was (am) a broke sucker in NYC. Currently, the events are collected by yours truly, from scrapers I wrote here. This site can be found here.
Since Coronavirus, I have pivoted to online free streaming events. All events are still currently NYC-focused. Once we return to a semblance of normal, I will bring back the map search functionality.
MVP - done, now on hold
MVP - done, now main branch
This is mostly a reminder for myself. Anyone else reading this may have difficulty setting up.
First you need to get a Google Maps API key. (The ones in package.json
will only work for my machine). Then amplify init
and all that jazz. It can be run with npm run-script start
. You will need to use the scrapers to populate the backend.
Goal | Tag | Priority | In Progress | Done |
---|---|---|---|---|
React Components | qol, js | low | ||
Filter public art by class | js | med | yes | unnecessary for MVP |
Flag public art | graphql, js | high | done | MVP |
Get photos & show info window | graphql, js | high | yes | MVP |
Upload new location | graphql, js | high | yes | |
UI & QOL improvements | qol, css, js | low | ||
Login process | UX | medium | ||
Long-term support | medium |
React/Components | Status |
---|---|
Have info window content be component that then contains form | done |
Forms should handle changes in multiple inputs with one method | |
Info window should be contained w/in google map screen (negates need to scroll) | done (sidebar) |
Currently queries a location and fills the sidebar in one function (separate) |
Filter public art by class | Status | Priority |
---|---|---|
Add options | done | medium |
Ability to select multiple options | lowest | |
Store types as list in dynamoDB (currently only one type allowed) | low | |
Make types an enum in Appsync GraphQL API | done | |
Check 'type' is chosen by user when uploading new location | done | low |
add 'professional' type - for business/resume help | medium |
Free events | Status | Priority |
---|---|---|
Initial creation | done | |
Searchable in app | ||
Accept new picture upload | ||
Accept report/flagging | ||
Search button should switch between public art and events | done | HIGH |
Filter search by date/time | EVENT - time only | HIGH |
Do you need to sign up ahead of time? For Carnegie Hall, yes | ||
Type checker on upload (python) | ||
Dates should be a discrete list (instead of start/end) | done | HIGH |
If searching for current day, ignore events with time < now | mid-high | |
Display event description | done | high |
Event calendar should open on date from search | done | medium |
Consider splitting 'art' into 'fine art' and 'arts & crafts' | low | |
In schema: unify event and art with inherited 'location' type | low | |
Flag events | done | mid-high |
Option for all-day events & multiple days | mid | |
Can click tile to open in own window (Routes) | mid |
Flag public art/event | Status |
---|---|
Seperate DynamoDB table | done |
Authentication for users | done |
Store with location ID instead of just art name | done |
Show error when user does not select reason (currently only in console) | done |
Get photos & Info Window | Status |
---|---|
Download from DB | done |
Close old info window when a new one is opened | done |
Upload resized photos to db (400 x 400?) | done - max dimension of 250px |
Enforce Google Places API from app/site only - key has no restrictions | |
Error if photo doesn't exist: info window does not open | done (?) |
throttles many requests: photo should only be rendered if infoWindow is shown | done (?) |
leave googleusercontent & store photos from google on S3 (being throttled) | done |
search should ignore non-permenent locations that are out of date | done |
search type should be enum | done |
ES console - Invalid host header requests? |
Upload new Location (and photo) | Status |
---|---|
Upload to DB | done |
Upload photos from app (mobile app only?) | URGENT |
Should suggest user's current location | done |
Each upload submission creates duplicate empty divs (bugfix) | low priority |
Upload new image should also add link in DynamoDB image list | done |
Only create new upload div if the old one does not exist (bugfix) | done |
Upload to ES after dynamodb | done - @searchable |
PublicArt in DynamoDb should have version to prevent double writes | |
Should image list be list of 'AWSURL' AppSync type? | done |
If 'close' button clicked, then sidebar reopened, image should remain | done |
If any part of image upload fails, entire thing should fail | |
Remove pin after upload | done |
Make most graphql fields mandatory | done |
Unauthenticated, rejected uploads should notify the user why they have failed | URGENT |
Image upload should include which user uploaded it | REQ for MVP |
Image upload should take url OR image from disk | URGENT |
Upon successful upload, should clear sidebar | done |
Image upload should take jpg | done |
UI & QOL improvements | Status |
---|---|
Resize image window to a standard size | done |
Place 'Report location' in own div | |
Main dropdown menu size more consistent | |
All code to call AWS client should be in one file (-_-) | done |
Change name "flag form" -> "report form" | MVP - unchanged in graphql |
Fix problem with 'amplify publish' | using Amplify console |
Google uses 'lng', ES uses 'lon' -> inconsistent | |
Revert aws-appsync package to official npm | done |
Revert to default network fetch policy (currently always fetches) | |
Make PublicArt schema @searchable (will then automatically push to ES) | in progress |
Put Data Sources into api/CustomResources.json for eternal use | mostly pre-generated |
Consider making sidebar collapsible | done |
Collapsing sidebar should not move center of map | |
Host on a readable url | done |
Bottom button should not truncate text | done |
Make sure all requests/queries have error catching | done |
Fix 'cannot get /with-sidebar' bug | |
Speed up/streamline map load | HIGH PRIORITY |
Improve date/calendar css | med/high |
Make mobile-responsive | med/high |
Login Process (currently run by AWS) | Status |
---|---|
User should only have to login to upload new image | done |
Sign up should not care about phone number | |
Sign up should show error messages (not just console.log it) | HIGH PRIORITY |
Log in should be self contained (not in art upload div) | done |
Should have user feedback -> automatically include the user's search params |
Scraping/parsing | Status | Priority |
---|---|---|
All titles should be capitalized | done | |
Typecheck entries | med | |
Check existence of all necessary fields | done | |
Maybe just regex all paren & take last one? (instead of looking for paren in last sentence) | done | |
Event type should be a list & take multiple options | done | |
Should be able to split single event into multiple different | low | |
Should be able to reject creation of event | done | |
Add date range type as seperate type (2-d list? or list of 2-d lists?) | med-high | |
Consider splitting 'source' into title & url object? | low |
Long-term Support | Status | Priority |
---|---|---|
Backup data - 3 formats, 3 locations | immediately after MVP | |
Create amplify 'dev' env w/ seperate ES & DynamoDB | immediately after MVP | |
Unit tests | Immediately after MVP | |
Make history API usage more elegant | mid/low | |
AWS Rekognition to reject images that do not meet decency guidelines | low | |
Use Authentication to credit uploaded images (like Google?) | mid | |
Use AI & NLP to classify types from description | mid |
non-code | Status |
---|---|
Create some user journeys |
- Use AWS Rekognition to reject images that do not meet decency guidelines
- Use Auth to credit images (like Google does)