{
  "swagger": "2.0",
  "info": {
	"version": "1.0.0",
	"title": "TellForm API",
	"contact": {
	  "name": "TellForm Team",
	  "email": "team@tellform.com"
	}
  },
  "externalDocs": {
	"description": "Find out how to host your own TellForm instance.",
	"url": "https://github.com/whitef0x0/tellform"
  },
  "host": "api.tellform.com",
  "basePath": "/",
  "schemes": [
	"http",
	"https"
  ],
  "tags": [
	{
	  "name": "form",
	  "description": "Everything about your Forms"
	},
	{
	  "name": "user",
	  "description": "Everything about your Account"
	}
  ],
  "securityDefinitions": {
	"api_key": {
	  "type": "apiKey",
	  "name": "apikey",
	  "in": "header"
	}
  },
  "paths": {
	"/forms": {
	  "get": {
		"tags": [
		  "form"
		],
		"summary": "Find all forms",
		"responses": {
		  "405": {
			"description": "Missing Form Input"
		  },
		  "400": {
			"description": "Form is Invalid"
		  },
		  "404": {
			"description": "Form not Found"
		  },
		  "200": {
			"description": "forms response",
			"schema": {
			  "type": "array",
			  "items": {
				"$ref": "#/definitions/Form"
			  }
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		]
	  }
	},
	"/form/:form_id": {
	  "get": {
		"tags": [
		  "form"
		],
		"summary": "Find form by ID",
		"responses": {
		  "200": {
			"description": "forms response",
			"schema": {
			  "$ref": "#/definitions/Form"
			},
			"headers": {
			  "x-expires": {
				"type": "string"
			  }
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		]
	  },
	  "post": {
		"tags": [
		  "form"
		],
		"summary": "Create a new form",
		"description": "Create and save a new form",
		"operationId": "addForm",
		"consumes": [
		  "application/json"
		],
		"produces": [
		  "application/json"
		],
		"parameters": [
		  {
			"in": "body",
			"name": "body",
			"description": "Form object that is to be created",
			"required": true,
			"schema": {
			  "$ref": "#/definitions/Form"
			}
		  }
		],
		"responses": {
		  "405": {
			"description": "Missing Form Input"
		  },
		  "400": {
			"description": "Form is Invalid"
		  },
		  "404": {
			"description": "Form not Found"
		  },
		  "200": {
			"description": "successful operation",
			"schema": {
			  "$ref": "#/definitions/Form"
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		],
		"x-code-samples": [
		]
	  },
	  "put": {
		"tags": [
		  "form"
		],
		"summary": "Update an existing form",
		"description": "",
		"operationId": "updateForm",
		"consumes": [
		  "application/json"
		],
		"produces": [
		  "application/json"
		],
		"parameters": [
		  {
			"in": "body",
			"name": "form",
			"description": "Form object that needs to be updated",
			"required": true,
			"schema": {
			  "$ref": "#/definitions/Form"
			}
		  }
		],
		"responses": {
		  "405": {
			"description": "Missing Form Input"
		  },
		  "400": {
			"description": "Form is Invalid"
		  },
		  "404": {
			"description": "Form not Found"
		  },
		  "200": {
			"description": "successful operation",
			"schema": {
			  "$ref": "#/definitions/Form"
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		],
		"x-code-samples": [
		]
	  }
	},
	"/users/me": {
	  "get": {
		"tags": [
		  "user"
		],
		"summary": "Retrieve current User",
		"description": "",
		"operationId": "getUser",
		"produces": [
		  "application/json"
		],
		"responses": {
		  "500": {
			"description": "Could not Update User"
		  },
		  "401": {
			"description": "User is not Signed in"
		  },
		  "403": {
			"description": "User is not Authorized"
		  },
		  "404": {
			"description": "User does not exsit"
		  },
		  "200": {
			"description": "successful operation",
			"schema": {
			  "$ref": "#/definitions/User"
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		]
	  }
	},
	"/users": {
	  "put": {
		"tags": [
		  "user"
		],
		"summary": "Update the current user",
		"description": "",
		"operationId": "updateUser",
		"consumes": [
		  "application/json"
		],
		"produces": [
		  "application/json"
		],
		"parameters": [
		  {
			"in": "body",
			"name": "body",
			"description": "User object that needs to be updated",
			"required": true,
			"schema": {
			  "$ref": "#/definitions/User"
			}
		  }
		],
		"responses": {
		  "500": {
			"description": "Could not Update User"
		  },
		  "401": {
			"description": "User is not Signed in"
		  },
		  "403": {
			"description": "User is not Authorized"
		  },
		  "404": {
			"description": "User does not exsit"
		  },
		  "200": {
			"description": "successful operation",
			"schema": {
			  "$ref": "#/definitions/User"
			}
		  }
		},
		"security": [
		  {
			"api_key": []
		  }
		],
		"x-code-samples": [
		]
	  }
	}

  },
  "definitions": {
	"User": {
	  "type": "object",
	  "required": [
		"language",
		"email",
		"username"
	  ],
	  "properties": {
		"firstName": {
		  "type": "string",
		  "description": "First name of User",
		  "example": "John"
		},
		"lastName": {
		  "type": "string",
		  "description": "First name of User",
		  "example": "Doe"
		},
		"language": {
		  "type": "string",
		  "enum": [
			"en",
			"fr",
			"es",
			"it",
			"de"
		  ],
		  "default": "en",
		  "required": "User must have a language",
		  "description": "Language of User (for internationalization)",
		  "example": "fr"
		},
		"email": {
		  "type": "string",
		  "format": "email",
		  "required": "User email cannot be blank",
		  "unique": "true",
		  "description": "Email of User",
		  "example": "john.doe@somewhere.com"
		},
		"username": {
		  "type": "string",
		  "required": "Username cannot be blank",
		  "unique": "true",
		  "description": "Username of User",
		  "example": "johndoe"
		},
		"roles": {
		  "type": "array",
		  "items": {
			"type": "string",
			"enum": [
			  "user",
			  "admin",
			  "superuser"
			]
		  },
		  "default": [ "user" ],
		  "description": "Security Roles of User"
		}
	  },
	  "lastModified": {
		"type": "date",
		"description": "Date that user was last modified",
		"example": "2016-08-26T20:19:30.146Z"
	  },
	  "created": {
		"type": "date",
		"description": "Date that user was created on",
		"example": "5dHuKJgeCZmFOdJTnmg0lrxApmz0tbbBrM59rTv4k79"
	  },
	  "resetPasswordToken": {
		"type": "string",
		"description": "Reset password token  of User",
		"example": "5dHuKJgeCZmFOdJTnmg0lrxApmz0tbbBrM59rTv4k79"
	  },
	  "resetPasswordExpires": {
		"type": "date",
		"example": "2016-08-26T20:19:30.146Z",
		"description": "Date that the User's password reset token expires"
	  },
	  "token": {
		"type": "string",
		"description": "Verification token of User",
		"example": "5dHuKJgeCZmFOdJTnmg0lrxApmz0tbbBrM59rTv4k79"
	  },
	  "apiKey": {
		"type": "string",
		"unique": true,
		"index": true,
		"sparse": true,
		"description": "API Key of User",
		"example": "5dHuKJgeCZmFOdJTnmg0lrxApmz0tbbBrM59rTv4k79"
	  }
	},
	"LogicJump": {
	  "expressionString": {
		"type": "string",
		"enum": [
		  "field == static",
		  "field != static",
		  "field > static",
		  "field >= static",
		  "field <= static",
		  "field < static",
		  "field contains static",
		  "field !contains static",
		  "field begins static",
		  "field !begins static",
		  "field ends static",
		  "field !ends static"
		]
	  },
	  "fieldA": {
		"$ref": "#/definitions/FormField"
	  },
	  "valueB": {
		"type": "string"
	  },
	  "jumpTo": {
		"$ref": "#/definitions/FormField"
	  }
	},
	"FieldOption": {
	  "type": "object",
	  "properties": {
		"option_id": {
		  "type": "number"
		},
		"option_title": {
		  "type": "string"
		},
		"option_value": {
		  "type": "string",
		  "trim": true
		}
	  }
	},
	"RatingField": {
	  "type": "object",
	  "properties": {
		"steps": {
		  "type": "number",
		  "min": 1,
		  "max": 10
		},
		"shape": {
		  "type": "string",
		  "enum": [
			"Heart",
			"Star",
			"thumbs-up",
			"thumbs-down",
			"Circle",
			"Square",
			"Check Circle",
			"Smile Outlined",
			"Hourglass",
			"bell",
			"Paper Plane",
			"Comment",
			"Trash"
		  ]
		},
		"validShapes": {
		  "type": "array",
		  "items": {
			"type": "string"
		  }
		}
	  }
	},
	"FormField": {
	  "required": [
		"title",
		"fieldType"
	  ],
	  "properties": {
		"isSubmission": {
		  "type": "boolean",
		  "default": false,
		  "description": "Specifies whether Field is part of a Submission or not",
		  "example": true
		},
		"submissionId": {
		  "type": "string",
		  "description": "ID of Submission that this Field belongs to",
		  "example": "57bca0969ca8e18b825bcc2b"
		},
		"title": {
		  "type": "string",
		  "trim": true,
		  "required": "Field Title cannot be blank",
		  "description": "Description of Field",
		  "example": "Your Current University"
		},
		"description": {
		  "type": "string",
		  "default": "",
		  "description": "Description of Field",
		  "example": "Please do not use abbreviations for your school name"
		},
		"logicJump": {
		  "$ref": "#/definitions/FormField"
		},
		"ratingOptions": {
		  "type": "#/definitions/RatingField"
		},
		"fieldOptions": {
		  "type": "array",
		  "items": {
			"type": "FieldOption"
		  }
		},
		"required": {
		  "type": "boolean",
		  "default": true,
		  "description": "Specifies whether Field is required",
		  "example": true
		},
		"disabled": {
		  "type": "boolean",
		  "default": false,
		  "description": "Specifies whether Field is disabled",
		  "example": true
		},
		"deletePreserved": {
		  "type": "boolean",
		  "default": false,
		  "description": "Specifies whether Field should be preserved if it is deleted",
		  "example": false
		},
		"validFieldTypes": {
		  "type": "array",
		  "items": {
			"type": "string"
		  }
		},
		"fieldType": {
		  "type": "string",
		  "required": true,
		  "enum": [
			"textfield",
			"date",
			"email",
			"link",
			"legal",
			"url",
			"textarea",
			"statement",
			"welcome",
			"thankyou",
			"file",
			"dropdown",
			"scale",
			"rating",
			"radio",
			"checkbox",
			"hidden",
			"yes_no",
			"natural",
			"stripe",
			"number"
		  ],
		  "description": "Type of Field",
		  "example": "textfield"
		},
		"fieldValue": {
		  "type": "string",
		  "description": "Value of Field",
		  "example": "University of British Columbia"
		}
	  }
	},
	"VisitorData": {
	  "type": "object",
	  "properties": {
		"referrer": {
		  "type": "string",
		  "description": "Referring site of Form Visitor",
		  "example": "http://google.com"
		},
		"lastActiveField": {
		  "type": "string",
		  "description": "ID of Last Active Field",
		  "example": "57bca0969ca8e18b825bcc2b"
		},
		"timeElapsed": {
		  "type": "number",
		  "description": "Time Elasped for Visitor on Form (in seconds)",
		  "example": "333.33"
		},
		"isSubmitted": {
		  "type": "boolean",
		  "description": "Specifies whether user submitted form before leaving page",
		  "example": false
		},
		"language": {
		  "type": "string",
		  "description": "Language of User using form",
		  "example": "en"
		},
		"ipAddr": {
		  "type": "string",
		  "default": "",
		  "description": "IP Address of User",
		  "example": "324.332.322.333"
		},
		"deviceType": {
		  "type": "string",
		  "enum": [
			"desktop",
			"phone",
			"tablet",
			"other"
		  ],
		  "default": "other",
		  "description": "Device Type of User",
		  "example": "phone"
		},
		"userAgent": {
		  "type": "string",
		  "description": "User Agent of User",
		  "example": "Mozilla/5.0 (Linux; <Android Version>; <Build Tag etc.>) AppleWebKit/<WebKit Rev> (KHTML, like Gecko) Chrome/<Chrome Rev> Mobile Safari/<WebKit Rev>"
		}
	  }
	},
	"Button": {
	  "type": "object",
	  "properties": {
		"url": {
		  "type": "string",
		  "format": "url",
		  "description": "URL of Button Link",
		  "example": "http://you-are-awesome.com"
		},
		"action": {
		  "type": "string",
		  "description": "Angular Action fired during Button click",
		  "example": "openModal()"
		},
		"text": {
		  "type": "string",
		  "description": "Text of Button",
		  "example": "Go to HomePage"
		},
		"bgColor": {
		  "type": "string",
		  "pattern": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
		  "default": "#5bc0de",
		  "description": "Background Color of Button (in hex)",
		  "example": "#5bc0de"
		},
		"color": {
		  "type": "string",
		  "pattern": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
		  "default": "#ffffff",
		  "description": "Font Color of Button (in hex)",
		  "example": "#ffffff"
		}
	  }
	},
	"FormSubmission": {
	  "type": "object",
	  "required": [
		"language",
		"admin",
		"title"
	  ],
	  "properties": {
		"title": {
		  "type": "string",
		  "required": "Form Title cannot be blank"
		},
		"language": {
		  "type": "string",
		  "enum": [
			"en",
			"fr",
			"es",
			"it",
			"de"
		  ],
		  "default": "en",
		  "required": "Form must have a language"
		},
		"admin": {
		  "$ref": "#/definitions/User",
		},
		"ipAddr": {
			"type": "string"
		},
		"geoLocation": {
		  "type": "object",
		  "properties": {
			"Country": {
			  "type": "string"
			},
			"Region": {
			  "type": "string"
			},
			"City": {
			  "type": "string"
			}
		  }
	  	},
		"device": {
		  "type": "object",
		  "properties": {
			"type": {
			  "type": "string"
			},
			"name": {
			  "type": "string"
			}
		  }
		},
		"pdfFilePath": {
		  "type": "string"
		},
		"pdf": {
		  "type": "string"
		},

		"timeElapsed": {
		  "type": "number"
		},
		"percentageComplete": {
		  "type": "number"
		}
	  }
	},
	"Form": {
	  "type": "object",
	  "required": [
		"language",
		"admin",
		"title"
	  ],
	  "properties": {

		"title": {
		  "type": "string",
		  "required": "Form Title cannot be blank",
		  "description": "Public Title of Form",
		  "example": "UBC CPSC221 Course Waitlist Form"
		},
		"language": {
		  "type": "string",
		  "enum": [
			"en",
			"fr",
			"es",
			"it",
			"de"
		  ],
		  "default": "en",
		  "required": "Form must have a language",
		  "description": "Language of Form",
		  "example": "en"
		},
		"analytics": {
		  "type": "object",
		  "description": "Analytics of Form",
		  "properties": {
			"gaCode": {
			  "type": "string",
			  "description": "Analytics of Form",
			  "example": "UA-000000-01"
			},
			"visitors": {
			  "type": "array",
			  "items": {
				"type": "#/definitions/VisitorData"
			  }
			}
		  }
		},
		"form_fields": {
		  "type": "array",
		  "items": {
			"type": "FormField"
		  }
		},
		"submissions": {
		  "type": "array",
		  "items": {
			"$ref": "#/definitions/FormSubmission"
		  }
		},
		"admin": {
		  "type": "User",
		  "description": "User that this Form belongs to"
		},
		"startPage": {
		  "type": "object",
		  "properties": {
			"showStart": {
			  "type": "boolean",
			  "default": false,
			  "description": "Specifies whether Form StarPage should be displayed",
			  "example": false
			},
			"introTitle": {
			  "type": "string",
			  "default": "Welcome to Form",
			  "description": "Title of Form's StartPage",
			  "example": "Welcome to our Awesome Form!"
			},
			"introParagraph": {
			  "type": "string",
			  "description": "Introduction paragraph for Form's StartPage.",
			  "example": "Welcome to our Awesome Form!"
			},
			"introButtonText": {
			  "type": "string",
			  "default": "Start",
			  "description": "StartPage Continue Button",
			  "example": "Continue"
			},
			"buttons": {
			  "type": "array",
			  "items": {
				type: "Button"
			  }
			}
		  }
		},
		"hideFooter": {
		  "type": "boolean",
		  "default": false,
		  "description": "Specifies whether to hide or show Form Footer",
		  "example": true
		},
		"isLive": {
		  "type": "boolean",
		  "default": false,
		  "description": "Specifies whether form is Publically available or Private",
		  "example": true
		},
		"design": {
		  "type": "object",
		  "properties": {
			"colors": {
			  "type": "object",
			  "properties": {
				"backgroundColor": {
				  "type": "string",
				  "pattern": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
				  "default": "#fff",
				  "description": "Background color of Form",
				  "example": "#4c4c4c"
				},
				"questionColor": {
				  "type": "string",
				  "match": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
				  "default": "#333",
				  "description": "Question text font color (in hex)",
				  "example": "#fff"
				},
				"answerColor": {
				  "type": "string",
				  "match": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
				  "default": "#333",
				  "description": "Answer text font color (in hex)",
				  "example": "#f9f9f9"
				},
				"buttonColor": {
				  "type": "string",
				  "match": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
				  "default": "#fff",
				  "description": "Background color of Form Buttons (in hex)",
				  "example": "#555"
				},
				"buttonTextColor": {
				  "type": "string",
				  "pattern": "/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
				  "default": "#333",
				  "description": "Font color of Form Buttons (in hex)",
				  "example": "#fff"
				}
			  }
			},
			"font": {
			  "type": "string"
			}
		  }
		}
	  }
	}
  }
}
