def post(self): ''' Create new sites to included in username searches. **Example Request** .. sourcecode:: json { "sites": [ { "name": "about.me", "url": "http://about.me/%s", "status_code": 200, "match_type": "text", "match_expr": "Foo Bar Baz", "test_username_pos": "john", "test_username_neg": "dPGMFrf72SaS", "headers": {"referer": "http://www.google.com"}, "censor_images": false, "wait_time": 5, "use_proxy": false, }, ... ] } **Example Response** .. sourcecode:: json { "message": "1 site created." } :<header Content-Type: application/json :<header X-Auth: the client's auth token :<json list sites: a list of sites to create :<json string sites[n].name: name of site :<json string sites[n].url: username search url for the site :<json int sites[n].status_code: the status code to check for determining a match (nullable) :<json string sites[n].match_type: type of match (see get_match_types() for valid match types) (nullable) :<json string sites[n].match_expr: expression to use for determining a page match (nullable) :<json string sites[n].test_username_pos: username that exists on site (used for testing) :<json string sites[n].test_username_neg: username that does not exist on site (used for testing) :<json array sites[n].headers: custom headers :<json bool sites[n].censor_images: whether to censor images from this profile :<json int sites[n].wait_time: time (in seconds) to wait for updates after page is loaded :<json bool sites[n].use_proxy: whether to proxy requests for this profile URL :>header Content-Type: application/json :>json string message: API response message :status 200: created :status 400: invalid request body :status 401: authentication required ''' request_json = request.get_json() sites = [] # Ensure all data is valid before db operations for site_json in request_json['sites']: validate_request_json(site_json, _site_attrs) if (site_json['match_type'] is None or site_json['match_expr'] is None) and \ site_json['status_code'] is None: raise BadRequest('At least one of the ' 'following is required: ' 'status code or page match.') if '%s' not in site_json['url']: raise BadRequest('URL must contain replacement character %s') # Save sites for site_json in request_json['sites']: test_username_pos = site_json['test_username_pos'].lower().strip() site = Site(name=site_json['name'].strip(), url=site_json['url'].lower().strip(), test_username_pos=test_username_pos) site.status_code = site_json['status_code'] site.match_expr = site_json['match_expr'] site.match_type = site_json['match_type'] if 'test_username_neg' in site_json: site.test_username_neg = site_json['test_username_neg'] \ .lower().strip(), if 'headers' in site_json: site.headers = site_json['headers'] g.db.add(site) try: g.db.flush() sites.append(site) except IntegrityError: g.db.rollback() raise BadRequest('Site URL {} already exists.'.format( site.url)) g.db.commit() # Send redis notifications for site in sites: notify_mask_client(channel='site', message={ 'id': site.id, 'name': site.name, 'status': 'created', 'resource': None }) message = '{} new sites created'.format(len(request_json['sites'])) response = jsonify(message=message) response.status_code = 202 return response
def post(self): ''' Create new sites to included in username searches. **Example Request** .. sourcecode:: json { "sites": [ { "name": "about.me", "url": "http://about.me/%s", "category": "social", "status_code": 200, "match_type": "text", "match_expr": "Foo Bar Baz", "test_username_pos": "john", "test_username_neg": "dPGMFrf72SaS" }, ... ] } **Example Response** .. sourcecode:: json { "message": "1 site created." } :<header Content-Type: application/json :<header X-Auth: the client's auth token :>json list sites: a list of sites to create :>json string sites[n].name: name of site :>json string sites[n].url: username search url for the site :>json string sites[n].category: category of the site :>json int sites[n].status_code: the status code to check for determining a match (nullable) :>json string sites[n].match_type: type of match (see get_match_types() for valid match types) (nullable) :>json string sites[n].match_expr: expression to use for determining a page match (nullable) :>json string sites[n].test_username_pos: username that exists on site (used for testing) :>json string sites[n].test_username_neg: username that does not exist on site (used for testing) :status 200: created :status 400: invalid request body :status 401: authentication required ''' request_json = request.get_json() sites = [] # Ensure all data is valid before db operations for site_json in request_json['sites']: validate_request_json(site_json, SITE_ATTRS) if (site_json['match_type'] is None or \ site_json['match_expr'] is None) and \ site_json['status_code'] is None: raise BadRequest('At least one of the following is required: ' 'status code or page match.') # Save sites for site_json in request_json['sites']: test_username_pos = site_json['test_username_pos'].lower().strip() site = Site(name=site_json['name'].lower().strip(), url=site_json['url'].lower().strip(), category=site_json['category'].lower().strip(), test_username_pos=test_username_pos) site.status_code = site_json['status_code'] site.match_expr = site_json['match_expr'] site.match_type = site_json['match_type'] if 'test_username_neg' in site_json: site.test_username_neg = site_json['test_username_neg'] \ .lower().strip(), g.db.add(site) try: g.db.flush() sites.append(site) except IntegrityError: g.db.rollback() raise BadRequest( 'Site URL {} already exists.'.format(site.url) ) g.db.commit() # Send redis notifications for site in sites: notify_mask_client( channel='site', message={ 'id': site.id, 'name': site.name, 'status': 'created', 'resource': None } ) message = '{} new sites created'.format(len(request_json['sites'])) response = jsonify(message=message) response.status_code = 202 return response