Skip to content

Corona Donor - Rails Back End. Providing ready made, constantly evolving software to meet the needs of local mutual aid projects.

License

Notifications You must be signed in to change notification settings

skrobul/coronadonor-api

 
 

Repository files navigation

Corona Donor project (Rails Back end)

Development deployment instructions

  1. Ensure ImageMagick is installed locally, this is used for image manipulation.
  2. Pull this repos
  3. Install the gems - bundle install
  4. Create, and seed, the database - rake db:drop db:create db:migrate db:seed
  5. update the .env file with your AWS S3 credentials - used by paperclip
  6. Run rails s
  7. Connect to [http://localhost:3000]

Seed data

This is stored in db/seed.rb

Run via docker/docker-compose

# install gems (first time only)
$ cp .env.example .env # make necessary changes in .env (if required)
$ docker-compose run --rm --no-deps api bundle install
$ docker-compose run --rm api bundle exec rake db:setup
$ docker-compose up

App should be running at localhost:3000

Heroku deployment instructions

Download and install the Heroku CLI https://devcenter.heroku.com/articles/heroku-command-line

heroku login

heroku git:remote -a <APP NAME>

Deploy your application

git push heroku master

Reset database, note this is a destructive operation and should only be done if you don't want the data:

heroku pg:reset --confirm <APP NAME>

migrate and seed:

heroku rake db:migrate db:seed

Examples of use

To use these endpoints, you must set certain headers correctly - "Accept" must be set to "application/vnd.api+json" for GET, if you are POST, PATCH, or PUTting you need to also set "Content-Type" to "application/vnd.api+json" One way to interact with the API is on the command line with curl:

To get the data for scenario with id 2: curl -s -H "Accept: application/vnd.api+json" "https://<APP NAME>.herokuapp.com/scenarios/2?email=user@example.com&password=abc123

you can also use postman, or insomnia, if you prefer a GUI. The API conforms to the jsonapi specifications, but I've added some fields - such as requester_username in the scenario resource - for convenience that don't actually exist in that specific resource. I did this before I fully understood the API, and how the API consumer could properly ask for that information, but I guess that's fine for now.

Create a donation using curl:

curl --request POST \
  --url http://localhost:3000/donations?email=user@example.com&password=abc123 \
  --header 'accept: application/vnd.api+json' \
  --header 'content-type: application/vnd.api+json' \
  --data '{
  "data": {
    "type": "donations",
    "attributes": {
      "amount": "17"
    },
    "relationships": {
      "donator": {
        "data": {
          "type": "users",
          "id": "1"
        }
      },
      "scenario": {
        "data": {
          "id": "1",
          "type": "scenarios"
        }
      }
    }
  }
}'

Create a scenario - minimum

curl --request POST \
  --url http://localhost:3000/scenarios \
  --header 'accept: application/vnd.api+json' \
  --header 'content-type: application/vnd.api+json' \
  --data '{
  "data": {
    "type": "scenarios",
    "attributes": {

    },
    "relationships": {
			"verb": {
        "data": {
          "id": "1",
          "type": "verbs"
        }
      },
			"noun": {
        "data": {
          "id": "1",
          "type": "nouns"
        }
      },
			"event": {
        "data": {
          "id": "1",
          "type": "events"
        }
      }

    }
  }
}'

update a scenario, assigning it to a user to perform (a "doer"):

curl --request PATCH \
  --url http://localhost:3000/scenarios/15 \
  --header 'accept: application/vnd.api+json' \
  --header 'content-type: application/vnd.api+json' \
  --data '{
  "data": {
    "type": "scenarios",
		"id": 15,
    "attributes": {

    },
    "relationships": {
			"doer": {
        "data": {
          "id": "1",
          "type": "users"
        }
      }

    }
  }
}'

Get a scenario with all its child scenarios

curl --request GET \
  --url 'http://localhost:3000/scenarios/1?include=children_scenario' \
  --header 'accept: application/vnd.api+json' \
  --header 'content-type: application/vnd.api+json'

Create a requester ad "served to" interaction for user id 1, scenario id 1:

curl --request POST \
  --url http://localhost:3000/user_ad_interactions \
  --header 'accept: application/vnd.api+json' \
  --header 'content-type: application/vnd.api+json' \
  --data '
  {
    "data": {
      "type": "user_ad_interactions",
      "attributes": {},
      "relationships": {
        "user": {
          "data": {
            "type": "users",
            "id": "1"
          }
        },
        "scenario": {
          "data": {
            "id": "1",
            "type": "scenarios"
          }
        },
        "ad_type": {
          "data": {
            "id": "2",
            "type": "ad_types"
          }
        },
        "interaction_type": {
          "data": {
            "id": "1",
            "type": "interaction_types"
          }
        }
      }
    }
  }'

Add a parent_scenario to a scenario:

  {
  "data": {
    "type": "scenarios",
		"id": 1,
    "relationships": {
			"parent_scenario": {
        "data": {
          "id": "2",
          "type": "scenarios"
        }
      }
    }
  }
}

To get all children scenarios:

http://localhost:3000/scenarios/1?include=children_scenario

This will return the scenario with id 1, with an extended relationships section - it adds the "data" element:

"children_scenario": {
  "links": {
    "self": "http://localhost:3000/scenarios/1/relationships/children-scenario",
    "related": "http://localhost:3000/scenarios/1/children-scenario"
  },
  "data": [
    {
      "type": "scenarios",
      "id": "11"
    },
    {
      "type": "scenarios",
      "id": "12"
    },
    {
      "type": "scenarios",
      "id": "13"
    }
  ]
},

It also includes a full "scenario" at the end.

Here is the full output:

{
	"data": {
		"id": "1",
		"type": "scenarios",
		"links": {
			"self": "http://localhost:3000/scenarios/1"
		},
		"attributes": {
			"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/original/audrey.jpeg?1523492350",
			"noun": "roof",
			"event": "Hurricane Katrina",
			"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/thumb/audrey.jpeg?1523492350",
			"requesterlat": -41.2718598,
			"requesterlon": 174.7818482,
			"doerlat": -41.2718598,
			"doerlon": 174.7818482,
			"donated": "0.0",
			"funding_goal": "1000.0",
			"verified": false,
			"requester_firstname": "Audrey",
			"requester_lastname": "Audreyson",
			"doer_firstname": "jack",
			"doer_lastname": "jackson",
			"custom_message": "Help me fix my roof!",
			"parent_scenario_id": 2,
			"children": [
				11,
				12,
				13
			]
		},
		"relationships": {
			"verb": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/verb",
					"related": "http://localhost:3000/scenarios/1/verb"
				}
			},
			"noun": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/noun",
					"related": "http://localhost:3000/scenarios/1/noun"
				}
			},
			"requester": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/requester",
					"related": "http://localhost:3000/scenarios/1/requester"
				}
			},
			"doer": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/doer",
					"related": "http://localhost:3000/scenarios/1/doer"
				}
			},
			"event": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/event",
					"related": "http://localhost:3000/scenarios/1/event"
				}
			},
			"parent_scenario": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/parent-scenario",
					"related": "http://localhost:3000/scenarios/1/parent-scenario"
				}
			},
			"vouches": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/vouches",
					"related": "http://localhost:3000/scenarios/1/vouches"
				}
			},
			"donations": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/donations",
					"related": "http://localhost:3000/scenarios/1/donations"
				}
			},
			"children_scenario": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/children-scenario",
					"related": "http://localhost:3000/scenarios/1/children-scenario"
				},
				"data": [
					{
						"type": "scenarios",
						"id": "11"
					},
					{
						"type": "scenarios",
						"id": "12"
					},
					{
						"type": "scenarios",
						"id": "13"
					}
				]
			},
			"user_ad_interaction": {
				"links": {
					"self": "http://localhost:3000/scenarios/1/relationships/user-ad-interaction",
					"related": "http://localhost:3000/scenarios/1/user-ad-interaction"
				}
			}
		}
	},
	"included": [
		{
			"id": "11",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/11"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "materials",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"children": []
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/verb",
						"related": "http://localhost:3000/scenarios/11/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/noun",
						"related": "http://localhost:3000/scenarios/11/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/requester",
						"related": "http://localhost:3000/scenarios/11/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/doer",
						"related": "http://localhost:3000/scenarios/11/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/event",
						"related": "http://localhost:3000/scenarios/11/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/11/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/vouches",
						"related": "http://localhost:3000/scenarios/11/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/donations",
						"related": "http://localhost:3000/scenarios/11/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/11/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/11/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "12",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/12"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "transportation",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"children": []
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/verb",
						"related": "http://localhost:3000/scenarios/12/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/noun",
						"related": "http://localhost:3000/scenarios/12/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/requester",
						"related": "http://localhost:3000/scenarios/12/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/doer",
						"related": "http://localhost:3000/scenarios/12/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/event",
						"related": "http://localhost:3000/scenarios/12/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/12/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/vouches",
						"related": "http://localhost:3000/scenarios/12/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/donations",
						"related": "http://localhost:3000/scenarios/12/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/12/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/12/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "13",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/13"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "volunteers",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"children": []
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/verb",
						"related": "http://localhost:3000/scenarios/13/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/noun",
						"related": "http://localhost:3000/scenarios/13/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/requester",
						"related": "http://localhost:3000/scenarios/13/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/doer",
						"related": "http://localhost:3000/scenarios/13/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/event",
						"related": "http://localhost:3000/scenarios/13/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/13/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/vouches",
						"related": "http://localhost:3000/scenarios/13/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/donations",
						"related": "http://localhost:3000/scenarios/13/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/13/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/13/user-ad-interaction"
					}
				}
			}
		}
	]
}

To get a list of all parent scenarios, with their children scenarios embedded: http://localhost:3000/scenarios?include=children_scenario&filter[is_sub_task]=false

{
	"data": [
		{
			"id": "1",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/1"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/original/audrey.jpeg?1523492350",
				"noun": "roof",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/thumb/audrey.jpeg?1523492350",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": -41.2718598,
				"doerlon": 174.7818482,
				"donated": "0.0",
				"funding_goal": "1000.0",
				"verified": false,
				"requester_firstname": "Audrey",
				"requester_lastname": "Audreyson",
				"doer_firstname": "jack",
				"doer_lastname": "jackson",
				"custom_message": "Help me fix my roof!",
				"parent_scenario_id": 2,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/verb",
						"related": "http://localhost:3000/scenarios/1/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/noun",
						"related": "http://localhost:3000/scenarios/1/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/requester",
						"related": "http://localhost:3000/scenarios/1/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/doer",
						"related": "http://localhost:3000/scenarios/1/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/event",
						"related": "http://localhost:3000/scenarios/1/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/1/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/vouches",
						"related": "http://localhost:3000/scenarios/1/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/donations",
						"related": "http://localhost:3000/scenarios/1/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/1/children-scenario"
					},
					"data": [
						{
							"type": "scenarios",
							"id": "11"
						},
						{
							"type": "scenarios",
							"id": "12"
						},
						{
							"type": "scenarios",
							"id": "13"
						}
					]
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/1/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/1/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "11",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/11"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "materials",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/verb",
						"related": "http://localhost:3000/scenarios/11/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/noun",
						"related": "http://localhost:3000/scenarios/11/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/requester",
						"related": "http://localhost:3000/scenarios/11/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/doer",
						"related": "http://localhost:3000/scenarios/11/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/event",
						"related": "http://localhost:3000/scenarios/11/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/11/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/vouches",
						"related": "http://localhost:3000/scenarios/11/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/donations",
						"related": "http://localhost:3000/scenarios/11/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/11/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/11/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/11/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "12",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/12"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "transportation",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/verb",
						"related": "http://localhost:3000/scenarios/12/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/noun",
						"related": "http://localhost:3000/scenarios/12/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/requester",
						"related": "http://localhost:3000/scenarios/12/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/doer",
						"related": "http://localhost:3000/scenarios/12/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/event",
						"related": "http://localhost:3000/scenarios/12/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/12/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/vouches",
						"related": "http://localhost:3000/scenarios/12/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/donations",
						"related": "http://localhost:3000/scenarios/12/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/12/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/12/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/12/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "13",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/13"
			},
			"attributes": {
				"image": "/images/original/missing.png",
				"noun": "volunteers",
				"event": "Hurricane Katrina",
				"imagethumb": "/images/thumb/missing.png",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": null,
				"doerlon": null,
				"donated": "0.0",
				"funding_goal": null,
				"verified": false,
				"requester_firstname": "jack",
				"requester_lastname": "jackson",
				"doer_firstname": null,
				"doer_lastname": null,
				"custom_message": null,
				"parent_scenario_id": 1,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/verb",
						"related": "http://localhost:3000/scenarios/13/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/noun",
						"related": "http://localhost:3000/scenarios/13/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/requester",
						"related": "http://localhost:3000/scenarios/13/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/doer",
						"related": "http://localhost:3000/scenarios/13/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/event",
						"related": "http://localhost:3000/scenarios/13/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/13/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/vouches",
						"related": "http://localhost:3000/scenarios/13/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/donations",
						"related": "http://localhost:3000/scenarios/13/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/13/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/13/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/13/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "23",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/23"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/023/original/data?1523500422",
				"noun": "nails",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/023/thumb/data?1523500422",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 22,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/verb",
						"related": "http://localhost:3000/scenarios/23/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/noun",
						"related": "http://localhost:3000/scenarios/23/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/requester",
						"related": "http://localhost:3000/scenarios/23/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/doer",
						"related": "http://localhost:3000/scenarios/23/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/event",
						"related": "http://localhost:3000/scenarios/23/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/23/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/vouches",
						"related": "http://localhost:3000/scenarios/23/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/donations",
						"related": "http://localhost:3000/scenarios/23/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/23/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/23/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/23/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "24",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/24"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/024/original/data?1523500422",
				"noun": "labourer",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/024/thumb/data?1523500422",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 22,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/verb",
						"related": "http://localhost:3000/scenarios/24/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/noun",
						"related": "http://localhost:3000/scenarios/24/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/requester",
						"related": "http://localhost:3000/scenarios/24/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/doer",
						"related": "http://localhost:3000/scenarios/24/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/event",
						"related": "http://localhost:3000/scenarios/24/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/24/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/vouches",
						"related": "http://localhost:3000/scenarios/24/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/donations",
						"related": "http://localhost:3000/scenarios/24/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/24/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/24/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/24/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "25",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/25"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/025/original/data?1523500422",
				"noun": "volunteers",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/025/thumb/data?1523500422",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 22,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/verb",
						"related": "http://localhost:3000/scenarios/25/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/noun",
						"related": "http://localhost:3000/scenarios/25/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/requester",
						"related": "http://localhost:3000/scenarios/25/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/doer",
						"related": "http://localhost:3000/scenarios/25/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/event",
						"related": "http://localhost:3000/scenarios/25/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/25/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/vouches",
						"related": "http://localhost:3000/scenarios/25/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/donations",
						"related": "http://localhost:3000/scenarios/25/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/25/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/25/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/25/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "27",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/27"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/027/original/data?1523500499",
				"noun": "labourer",
				"event": "Kaikora Earthquake",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/027/thumb/data?1523500499",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 26,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/verb",
						"related": "http://localhost:3000/scenarios/27/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/noun",
						"related": "http://localhost:3000/scenarios/27/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/requester",
						"related": "http://localhost:3000/scenarios/27/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/doer",
						"related": "http://localhost:3000/scenarios/27/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/event",
						"related": "http://localhost:3000/scenarios/27/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/27/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/vouches",
						"related": "http://localhost:3000/scenarios/27/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/donations",
						"related": "http://localhost:3000/scenarios/27/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/27/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/27/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/27/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "28",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/28"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/028/original/data?1523500499",
				"noun": "nails",
				"event": "Kaikora Earthquake",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/028/thumb/data?1523500499",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 26,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/verb",
						"related": "http://localhost:3000/scenarios/28/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/noun",
						"related": "http://localhost:3000/scenarios/28/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/requester",
						"related": "http://localhost:3000/scenarios/28/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/doer",
						"related": "http://localhost:3000/scenarios/28/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/event",
						"related": "http://localhost:3000/scenarios/28/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/28/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/vouches",
						"related": "http://localhost:3000/scenarios/28/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/donations",
						"related": "http://localhost:3000/scenarios/28/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/28/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/28/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/28/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "29",
			"type": "scenarios",
			"links": {
				"self": "http://localhost:3000/scenarios/29"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/029/original/data?1523500499",
				"noun": "volunteers",
				"event": "Kaikora Earthquake",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/029/thumb/data?1523500499",
				"requesterlat": -41.2855188,
				"requesterlon": 174.7952354,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "50.0",
				"verified": false,
				"requester_firstname": "tom",
				"requester_lastname": "johnson",
				"doer_firstname": "tom",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 26,
				"ratio_for_user": 6,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/verb",
						"related": "http://localhost:3000/scenarios/29/verb"
					}
				},
				"noun": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/noun",
						"related": "http://localhost:3000/scenarios/29/noun"
					}
				},
				"requester": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/requester",
						"related": "http://localhost:3000/scenarios/29/requester"
					}
				},
				"doer": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/doer",
						"related": "http://localhost:3000/scenarios/29/doer"
					}
				},
				"event": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/event",
						"related": "http://localhost:3000/scenarios/29/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/parent-scenario",
						"related": "http://localhost:3000/scenarios/29/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/vouches",
						"related": "http://localhost:3000/scenarios/29/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/donations",
						"related": "http://localhost:3000/scenarios/29/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/children-scenario",
						"related": "http://localhost:3000/scenarios/29/children-scenario"
					},
					"data": []
				},
				"user_ad_interaction": {
					"links": {
						"self": "http://localhost:3000/scenarios/29/relationships/user-ad-interaction",
						"related": "http://localhost:3000/scenarios/29/user-ad-interaction"
					}
				}
			}
		}
	],
	"links": {
		"first": "http://localhost:3000/scenarios?filter%5Bis_sub_task%5D=false&include=children_scenario&page%5Blimit%5D=100&page%5Boffset%5D=0",
		"last": "http://localhost:3000/scenarios?filter%5Bis_sub_task%5D=false&include=children_scenario&page%5Blimit%5D=100&page%5Boffset%5D=0"
	}
}

Getting all the sceanrios you haven't dismissed the doer ads for:

get "/scenarios?filter[doer_ad_not_dismissed_by]=A_USER_ID_GOES_HERE", headers: headers

Pagination:

Offset Pagination

Limiting Returned Resources /users?page[limit]={resource_count} where {resource_count} = number of resources you want returned e.g. /users?page[limit]=5 will return the first 5 user resources

Offsetting Returned Resources:

/users?page[offset]={resource_offset} where {resource_offset} = the number of records to offset by prior to returning resources e.g. /users?page[offset]=10 will skip the first 10 user resources in the collection

Combining Limiting/Offsetting:

The limit and offset can be combined /users?page[limit]={resource_count}&page[offset]={resource_offset} e.g. /users?page[limit]=5&page[offset]=10 will skip user resources 0-10 and return resources 11-15

Walkthrough of a process to add children to a parent

Say we have 3 existing scenarios, 1, 2, and 3. We want 2 to be the parent and 1 and 3 to be children. At the moment, none of them have children or parents.

Here are the steps I took to assign scenario 1 a parent. The parent is scenario 2. This makes scenario 1 a child of scenario 2.

PATCH to https://<APP NAME>.herokuapp.com/scenarios/1 with

{
  "data": {
    "type": "scenarios",
		"id": 1,
    "relationships": {
			"parent_scenario": {
        "data": {
          "id": "2",
          "type": "scenarios"
        }
      }

    }
  }
}

we get a 200 response, with this partial json including

{
	"data": {
		"id": "1",
		"type": "scenarios",
		...
		"attributes": {
			...
      ...
			"parent_scenario_id": 2,
			"ratio_for_user": 2,
			"is_parent": false,
			"is_child": true,
			"is_complete": false
		},
		"relationships": {
    ...
    ...

Now, we GET the parent scenario 2 - including the children with https://<APP NAME>.herokuapp.com/scenarios/2?include=children_scenario

which gives us a scenario stanza with the boolean "is_parent": true, and an included child scenario under "relationships", and also it adds an "included" element as a sibling of "data" :

{
	"data": {
		"id": "2",
		"type": "scenarios",child
    ...
		"attributes": {
      ...
    	"parent_scenario_id": null,
			"ratio_for_user": 2,
			"is_parent": true,
			"is_child": false,
			"is_complete": false
		},
		"relationships": {
			...
      ...
			"children_scenario": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/children-scenario",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/children-scenario"
				},
				"data": [
					{
						"type": "scenarios",
						"id": "1"
					}
				]
			},
			...
      ...
		}
	},
	"included": [
		{
			"id": "1",
			"type": "scenarios",
			"links": {
				"self": "https://<APP NAME>.herokuapp.com/scenarios/1"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/original/audrey.jpeg?1523932085",
				"noun": "roof",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/thumb/audrey.jpeg?1523932085",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": -41.2718598,
				"doerlon": 174.7818482,
				"donated": "0.0",
				"funding_goal": "1000.0",
				"verified": false,
				"requester_firstname": "Audrey",
				"requester_lastname": "Audreyson",
				"doer_firstname": "jack",
				"doer_lastname": "jackson",
				"custom_message": "Help me fix my roof!",
				"parent_scenario_id": 2,
				"ratio_for_user": 2,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/verb",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/verb"
					}
				},
				"noun": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/noun",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/noun"
					}
				},
				"requester": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/requester",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/requester"
					}
				},
				"doer": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/doer",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/doer"
					}
				},
				"event": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/event",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/parent-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/vouches",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/donations",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/children-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/user-ad-interaction",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/user-ad-interaction"
					}
				}
			}
		}
	]
}

Lets make scenario 2 the parent of the other scenario - scenario 3:

PATCH https://<APP NAME>.herokuapp.com/scenarios/3 with

{
  "data": {
    "type": "scenarios",
		"id": 3,
    "relationships": {
			"parent_scenario": {
        "data": {
          "id": "2",
          "type": "scenarios"
        }
      }
    }
  }
}

We get back a 200 and a similar body to the first one.

Again, GET the parent scenario 2 - including the children with https://<APP NAME>.herokuapp.com/scenarios/2?include=children_scenario

we get a response that includes both children:

{
	"data": {
		"id": "2",
		"type": "scenarios",
    ...
		"attributes": {
			"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/002/original/gold.jpg?1523932087",
			...
			"parent_scenario_id": null,
			"ratio_for_user": 2,
			"is_parent": true,
			"is_child": false,
			"is_complete": false
		},
		"relationships": {
			...
      ...
			"children_scenario": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/children-scenario",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/children-scenario"
				},
				"data": [
					{
						"type": "scenarios",
						"id": "1"
					},
					{
						"type": "scenarios",
						"id": "3"
					}
				]
			},
      ...
		}
	},
	"included": [
		{
			"id": "1",
			"type": "scenarios",
			"links": {
				"self": "https://<APP NAME>.herokuapp.com/scenarios/1"
			},
      ...
      ...
		},
		{
			"id": "3",
			"type": "scenarios",
			"links": {
				"self": "https://<APP NAME>.herokuapp.com/scenarios/3"
			},
		  ...
      ...
		}
	]
}

The full response is:

{
	"data": {
		"id": "2",
		"type": "scenarios",
		"links": {
			"self": "https://<APP NAME>.herokuapp.com/scenarios/2"
		},
		"attributes": {
			"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/002/original/gold.jpg?1523932087",
			"noun": "gold",
			"event": "Kaikora Earthquake",
			"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/002/thumb/gold.jpg?1523932087",
			"requesterlat": -41.2718598,
			"requesterlon": 174.7818482,
			"doerlat": -41.2718598,
			"doerlon": 174.7818482,
			"donated": "0.0",
			"funding_goal": "3334.43",
			"verified": false,
			"requester_firstname": "jack",
			"requester_lastname": "jackson",
			"doer_firstname": "jean",
			"doer_lastname": "jeanson",
			"custom_message": null,
			"parent_scenario_id": null,
			"ratio_for_user": 2,
			"is_parent": true,
			"is_child": false,
			"is_complete": false
		},
		"relationships": {
			"verb": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/verb",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/verb"
				}
			},
			"noun": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/noun",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/noun"
				}
			},
			"requester": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/requester",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/requester"
				}
			},
			"doer": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/doer",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/doer"
				}
			},
			"event": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/event",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/event"
				}
			},
			"parent_scenario": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/parent-scenario",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/parent-scenario"
				}
			},
			"vouches": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/vouches",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/vouches"
				}
			},
			"donations": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/donations",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/donations"
				}
			},
			"children_scenario": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/children-scenario",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/children-scenario"
				},
				"data": [
					{
						"type": "scenarios",
						"id": "1"
					},
					{
						"type": "scenarios",
						"id": "3"
					}
				]
			},
			"user_ad_interaction": {
				"links": {
					"self": "https://<APP NAME>.herokuapp.com/scenarios/2/relationships/user-ad-interaction",
					"related": "https://<APP NAME>.herokuapp.com/scenarios/2/user-ad-interaction"
				}
			}
		}
	},
	"included": [
		{
			"id": "1",
			"type": "scenarios",
			"links": {
				"self": "https://<APP NAME>.herokuapp.com/scenarios/1"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/original/audrey.jpeg?1523932085",
				"noun": "roof",
				"event": "Hurricane Katrina",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/001/thumb/audrey.jpeg?1523932085",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": -41.2718598,
				"doerlon": 174.7818482,
				"donated": "0.0",
				"funding_goal": "1000.0",
				"verified": false,
				"requester_firstname": "Audrey",
				"requester_lastname": "Audreyson",
				"doer_firstname": "jack",
				"doer_lastname": "jackson",
				"custom_message": "Help me fix my roof!",
				"parent_scenario_id": 2,
				"ratio_for_user": 2,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/verb",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/verb"
					}
				},
				"noun": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/noun",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/noun"
					}
				},
				"requester": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/requester",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/requester"
					}
				},
				"doer": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/doer",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/doer"
					}
				},
				"event": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/event",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/parent-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/vouches",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/donations",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/children-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/1/relationships/user-ad-interaction",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/1/user-ad-interaction"
					}
				}
			}
		},
		{
			"id": "3",
			"type": "scenarios",
			"links": {
				"self": "https://<APP NAME>.herokuapp.com/scenarios/3"
			},
			"attributes": {
				"image": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/003/original/food.jpg?1523932090",
				"noun": "food",
				"event": "Kaikora Earthquake",
				"imagethumb": "//<S3 REGION>.amazonaws.com/<S3 BUCKET NAME>/scenarios/images/000/000/003/thumb/food.jpg?1523932090",
				"requesterlat": -41.2718598,
				"requesterlon": 174.7818482,
				"doerlat": -41.2855188,
				"doerlon": 174.7952354,
				"donated": "0.0",
				"funding_goal": "1111.22",
				"verified": false,
				"requester_firstname": "jean",
				"requester_lastname": "jeanson",
				"doer_firstname": "john",
				"doer_lastname": "johnson",
				"custom_message": null,
				"parent_scenario_id": 2,
				"ratio_for_user": 2,
				"is_parent": false,
				"is_child": true,
				"is_complete": false
			},
			"relationships": {
				"verb": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/verb",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/verb"
					}
				},
				"noun": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/noun",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/noun"
					}
				},
				"requester": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/requester",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/requester"
					}
				},
				"doer": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/doer",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/doer"
					}
				},
				"event": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/event",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/event"
					}
				},
				"parent_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/parent-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/parent-scenario"
					}
				},
				"vouches": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/vouches",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/vouches"
					}
				},
				"donations": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/donations",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/donations"
					}
				},
				"children_scenario": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/children-scenario",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/children-scenario"
					}
				},
				"user_ad_interaction": {
					"links": {
						"self": "https://<APP NAME>.herokuapp.com/scenarios/3/relationships/user-ad-interaction",
						"related": "https://<APP NAME>.herokuapp.com/scenarios/3/user-ad-interaction"
					}
				}
			}
		}
	]
}

A list of endpoints:

Below are all the endpoints available. They all conform to the jsonapi specifications

The types of ad's that can exist - requester, doer, donater and verifier at the moment

GET       /ad_types
POST      /ad_types
GET       /ad_types/:id
PUT|PATCH /ad_types/:id
DELETE    /ad_types/:id

Ways an ad can be interacted with that isn't "doing" it - "dismissed" and "served to" at the moment.

GET       /interaction_types
POST      /interaction_types
GET       /interaction_types/:id
PUT|PATCH /interaction_types/:id
DELETE    /interaction_types/:id

A list of ad interactions that a user performed - User X Dismissed the Doer ad for Scenario X:

GET       /user_ad_interactions
POST      /user_ad_interactions
GET       /user_ad_interactions/:id
PUT|PATCH /user_ad_interactions/:id
DELETE    /user_ad_interactions/:id

Any donations made by a user to a scenario:

GET       /donations
POST      /donations
GET       /donations/:id
PUT|PATCH /donations/:id
DELETE    /donations/:id

The events a scenario can be a part of - like "Kaikora Earthquake" or "Hurricane Katrina":

GET       /events
POST      /events
GET       /events/:id
PUT|PATCH /events/:id
DELETE    /events/:id

Any photos of the scenario being completed - a picture of a fixed roof, a picture of some bottles of delivered water, this is what a verifier produces:

GET       /vouches
POST      /vouches
GET       /vouches/:id
PUT|PATCH /vouches/:id
DELETE    /vouches/:id

These get and change related data - /vouches/:vouch_id/scenario gets the scenario this vouch is for

GET       /vouches/:vouch_id/relationships/scenario
PUT|PATCH /vouches/:vouch_id/relationships/scenario
DELETE    /vouches/:vouch_id/relationships/scenario
GET       /vouches/:vouch_id/scenario
GET       /vouches/:vouch_id/relationships/verifier
PUT|PATCH /vouches/:vouch_id/relationships/verifier
DELETE    /vouches/:vouch_id/relationships/verifier
GET       /vouches/:vouch_id/verifier

The scenarios requesters create, verb noun for requester. Subtasks are stored as other scenarios and can be gotten with GET {{ base_url }}/scenarios/:scenario_id/children-scenario

GET       /scenarios
POST      /scenarios
GET       /scenarios/:id
PUT|PATCH /scenarios/:id
DELETE    /scenarios/:id
GET       /scenarios/:scenario_id/relationships/verb
PUT|PATCH /scenarios/:scenario_id/relationships/verb
DELETE    /scenarios/:scenario_id/relationships/verb
GET       /scenarios/:scenario_id/verb
GET       /scenarios/:scenario_id/relationships/noun
PUT|PATCH /scenarios/:scenario_id/relationships/noun
DELETE    /scenarios/:scenario_id/relationships/noun
GET       /scenarios/:scenario_id/noun
GET       /scenarios/:scenario_id/relationships/requester
PUT|PATCH /scenarios/:scenario_id/relationships/requester
DELETE    /scenarios/:scenario_id/relationships/requester
GET       /scenarios/:scenario_id/requester
GET       /scenarios/:scenario_id/relationships/doer
PUT|PATCH /scenarios/:scenario_id/relationships/doer
DELETE    /scenarios/:scenario_id/relationships/doer
GET       /scenarios/:scenario_id/doer
GET       /scenarios/:scenario_id/relationships/event
PUT|PATCH /scenarios/:scenario_id/relationships/event
DELETE    /scenarios/:scenario_id/relationships/event
GET       /scenarios/:scenario_id/event
GET       /scenarios/:scenario_id/relationships/parent-scenario
PUT|PATCH /scenarios/:scenario_id/relationships/parent-scenario
DELETE    /scenarios/:scenario_id/relationships/parent-scenario
GET       /scenarios/:scenario_id/parent-scenario
GET       /scenarios/:scenario_id/relationships/vouches
POST      /scenarios/:scenario_id/relationships/vouches
PUT|PATCH /scenarios/:scenario_id/relationships/vouches
DELETE    /scenarios/:scenario_id/relationships/vouches
GET       /scenarios/:scenario_id/vouches
GET       /scenarios/:scenario_id/relationships/donations
POST      /scenarios/:scenario_id/relationships/donations
PUT|PATCH /scenarios/:scenario_id/relationships/donations
DELETE    /scenarios/:scenario_id/relationships/donations
GET       /scenarios/:scenario_id/donations
GET       /scenarios/:scenario_id/relationships/children-scenario
POST      /scenarios/:scenario_id/relationships/children-scenario
PUT|PATCH /scenarios/:scenario_id/relationships/children-scenario
DELETE    /scenarios/:scenario_id/relationships/children-scenario
GET       /scenarios/:scenario_id/children-scenario
GET       /scenarios/:scenario_id/relationships/user-ad-interaction
POST      /scenarios/:scenario_id/relationships/user-ad-interaction
PUT|PATCH /scenarios/:scenario_id/relationships/user-ad-interaction
DELETE    /scenarios/:scenario_id/relationships/user-ad-interaction
GET       /scenarios/:scenario_id/user-ad-interaction

A user:

GET       /users
POST      /users
GET       /users/:id
PUT|PATCH /users/:id
DELETE    /users/:id
GET       /users/:user_id/relationships/scenarios
POST      /users/:user_id/relationships/scenarios
PUT|PATCH /users/:user_id/relationships/scenarios
DELETE    /users/:user_id/relationships/scenarios
GET       /users/:user_id/scenarios
GET       /users/:user_id/relationships/requested
POST      /users/:user_id/relationships/requested
PUT|PATCH /users/:user_id/relationships/requested
DELETE    /users/:user_id/relationships/requested
GET       /users/:user_id/requested
GET       /users/:user_id/relationships/done
POST      /users/:user_id/relationships/done
PUT|PATCH /users/:user_id/relationships/done
DELETE    /users/:user_id/relationships/done
GET       /users/:user_id/done
GET       /users/:user_id/relationships/donated
POST      /users/:user_id/relationships/donated
PUT|PATCH /users/:user_id/relationships/donated
DELETE    /users/:user_id/relationships/donated
GET       /users/:user_id/donated
GET       /users/:user_id/relationships/verified
POST      /users/:user_id/relationships/verified
PUT|PATCH /users/:user_id/relationships/verified
DELETE    /users/:user_id/relationships/verified
GET       /users/:user_id/verified

Nouns:

GET       /nouns
POST      /nouns
GET       /nouns/:id
PUT|PATCH /nouns/:id
DELETE    /nouns/:id
GET       /nouns/:noun_id/relationships/scenarios
POST      /nouns/:noun_id/relationships/scenarios
PUT|PATCH /nouns/:noun_id/relationships/scenarios
DELETE    /nouns/:noun_id/relationships/scenarios
GET       /nouns/:noun_id/scenarios

Verbs:

GET       /verbs
POST      /verbs
GET       /verbs/:id
PUT|PATCH /verbs/:id
DELETE    /verbs/:id
GET       /verbs/:verb_id/relationships/scenarios
POST      /verbs/:verb_id/relationships/scenarios
PUT|PATCH /verbs/:verb_id/relationships/scenarios
DELETE    /verbs/:verb_id/relationships/scenarios
GET       /verbs/:verb_id/scenarios

About

Corona Donor - Rails Back End. Providing ready made, constantly evolving software to meet the needs of local mutual aid projects.

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Ruby 77.1%
  • HTML 19.6%
  • CSS 2.2%
  • Other 1.1%