· 9 years ago · Nov 29, 2016, 10:08 PM
1
2import os
3from flask import Flask, abort, request, jsonify, g, url_for
4from flask.ext.sqlalchemy import SQLAlchemy
5from flask.ext.httpauth import HTTPBasicAuth
6from passlib.apps import custom_app_context as pwd_context
7from itsdangerous import (TimedJSONWebSignatureSerializer
8 as Serializer, BadSignature, SignatureExpired)
9
10from models import*
11from flask_restful import reqparse, abort, Api, Resource, fields, marshal_with
12from sqlalchemy import exc
13from werkzeug import secure_filename
14import boto3
15import magic
16import requests
17from bs4 import BeautifulSoup
18headers = {
19 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36',
20 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
21
22}
23auth = HTTPBasicAuth()
24s3 = boto3.resource('s3')
25app.secret_key = 'some_secret'
26bucket = 'ben-uguru'
27filename = 'db.sqlite'
28s3 = boto3.resource('s3')
29
30
31
32
33cardsVal = 0
34@auth.verify_password
35def verify_password(email_or_token, password):
36 user = User.verify_auth_token(email_or_token)
37 if not user:
38 user = User.query.filter_by(email=email_or_token).first()
39 if not user or not user.verify_password(password):
40 return False
41 g.user = user
42 return True
43
44
45user_fields = {
46 'email':fields.String,
47 'token':fields.String
48}
49
50RegisterUserFields = {
51 'id': fields.Integer,
52 'email': fields.String,
53}
54putRequestFields = {
55 'token':fields.String,
56 'Message':fields.String(default='Successfully uploaded!')
57}
58class RegisterUser(Resource):
59 @marshal_with(RegisterUserFields)
60 def post(self):
61 jsonData = request.get_json(force=True)
62 bucket = jsonData['bucket']
63 email = jsonData['email']
64 password = jsonData['password']
65 if email is None or password is None:
66 abort(400)
67 if User.query.filter_by(email=email).first() is not None:
68 abort(400)
69 user = User(email=email)
70 file = jsonData['filename']
71 if file:
72 generate_static_token = user.generate_auth_token(700)
73 renameFile = file.replace(file,str(generate_static_token))
74 s3.meta.client.upload_file(renameFile, str(bucket),renameFile)
75 user.static_uri_token = generate_static_token
76 user.hash_password(password)
77 db.session.add(user)
78 db.session.commit()
79 return user
80
81 @auth.login_required
82 @marshal_with(putRequestFields)
83 def put(self):
84 token = g.user.generate_auth_token(700)
85 user.token = token
86 db.session.commit()
87 return user
88
89
90class UploadMultipleFiles(Resource):
91 def post(self):
92 jsonData = request.get_json(force=True)
93 token = jsonData['token']
94 user = User.query.filter_by(token=token).first()
95 if not user:
96 abort(400)
97 filename = jsonData['filename']
98 filetype = jsonData['filetype']
99 bucket = jsonData['bucket']
100 project_id = jsonData['project_id']
101 viewIDData = jsonData['view_id']
102 getFileType = magic.from_file(filename)
103 if filetype not in getFileType:
104 abort(422)
105 user = User.query.filter_by(token=token).first()
106 getProjects = UserProjects.query.filter_by(id=project_id).first()
107 getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
108 queryViews = Views.query.filter_by(id=viewIDData).first()
109 bucketFile = s3.meta.client.upload_file(filename, str(bucket),filename)
110 fileSizeSummary = s3.ObjectSummary(str(bucket), filename)
111 objectS = fileSizeSummary.get()
112 contentLength = objectS.get('ContentLength')
113 components = component(comp=queryViews, filetype=getFileType, filename=filename,file_url='https://ben-uguru.s3.amazonaws.com/'+filename, filesize=contentLength)
114 db.session.add(components)
115 objectSummary = s3.ObjectSummary(bucket,filename)
116 sumViewSize = Views.query.get(viewIDData)
117 getComponentForView = sumViewSize.component.all()
118 totalSumArr = []
119 for sizesinfo in getComponentForView:
120 totalSumArr.append(int(sizesinfo.filesize))
121 sumViewSize.filesize = sum(totalSumArr)
122 user.total_size = sumViewSize.filesize
123 db.session.commit()
124 object = objectSummary.get()
125 getComponents = component.query.filter_by(filename=filename).first()
126 getLastUploadedFileVersion = object.get('VersionId')
127 object_version = s3.ObjectVersion(str(bucket),filename,getLastUploadedFileVersion)
128 object1 = object_version.get()
129 ETag = object1.get('ETag')
130 queryversions = versions.query.filter_by(eTag=ETag).first()
131 limit = 10
132 getTotalItemsForAFile = versions.query.filter_by(filename=filename).all()
133 if len(getTotalItemsForAFile) == limit:
134 return jsonify({"Error":"Reached maximum limit for same file versions!"})
135 abort(400)
136 if queryversions:
137 return jsonify({"Error":"Can't upload if the file has no changes been made!"})
138 abort(400)
139 versionsAdd = versions(version_url='https://ben-uguru.s3.amazonaws.com/db.sqlite?versionID='+str(getLastUploadedFileVersion),filename=filename, version=getComponents, eTag=ETag)
140 db.session.add(versionsAdd)
141 db.session.commit()
142 return jsonify({'Msg':'file uploaded to a bucket!'})
143
144
145
146
147class NewObject(Resource):
148 def put(self):
149 jsonData = request.get_json(force=True)
150 comp_id = jsonData['comp_id']
151
152class APIUser(Resource):
153 @auth.login_required
154 @marshal_with(user_fields)
155 def get(self):
156 try:
157 token = g.user.generate_auth_token(700)
158 user = User.query.filter_by(email=g.user.email).first()
159 user.token = token
160 return user
161 except AttributeError:
162 abort(400)
163
164 @auth.login_required
165 def put(self,id):
166 newpassword = request.json.get('password')
167 user = User.query.get(id)
168 if not user:
169 abort(400)
170 else:
171 user.hash_password(newpassword)
172 db.session.commit()
173 return jsonify({'Msg:':'Updated Password!'})
174
175 @auth.login_required
176 def delete(self,id):
177 token = g.user.generate_auth_token(700)
178 user = User.query.filter_by(email=g.user.email).first()
179 user.token = token
180 db.session.commit()
181 return jsonify({'Msg':'Logged out!'})
182
183
184class AccessUser(Resource):
185 def get(self,auth_token,id):
186 user = User.verify_auth_token(auth_token)
187 try:
188 if user is None:
189 return jsonify({'Error':'invalid token/expired token'})
190 else:
191 queryUserBasedOnToken = User.query.filter_by(token=auth_token).first()
192 return jsonify({'data':'Welcome %s' % queryUserBasedOnToken.email})
193 except AttributeError:
194 return jsonify({'Error':'invalid token/expired token'})
195
196
197courses = {
198 'userCourses': fields.String,
199 'userID': fields.Integer
200}
201
202
203
204ViewsAttrs = {
205 'viewsNickName':fields.String,
206 'projectID':fields.Integer
207}
208
209# class AddProjectViews(Resource):
210# @marshal_with(ViewsAttrs)
211# def post(self):
212# ## Adds extra attributes to each views for instance project nickname etc.
213# ## This adds a new view to specified project_id
214# ## Parameters for this requests are:
215# ### -- Nickname
216# ### -- Token
217# ### -- project ID You want to create a VIEW FOR.
218# token = request.get_json(force=True)
219# tokenData = token['token']
220# viewID = request.get_json(force=True)
221# viewidData = viewID['project_id']
222# getViewID = UserProjects.query.filter_by(id=viewidData).first()
223# user = User.query.filter_by(token=tokenData).first()
224# if not user:
225# abort(400)
226# projectNickName = request.get_json(force=True)
227# projectNickNameData = projectNickName['nickname']
228# addProjectAttr = Views(viewsNickName=projectNickNameData,views=getViewID)
229# db.session.add(addProjectAttr)
230# db.session.commit()
231# return addProjectAttr
232
233
234projectData = {
235 'projectName':fields.String,
236}
237class CreateProject(Resource):
238 @marshal_with(projectData)
239 def post(self):
240 ####---- Parameters needed to make this requests:
241 # *ProjectName
242 # *Token
243 token = request.get_json(force=True)
244 tokenData = token['token']
245 user = User.query.filter_by(token=tokenData).first()
246 if not user:
247 abort(400)
248 jsonData = request.get_json(force=True)
249 projectname = jsonData['projectname']
250 projectnamedata = UserProjects(projectName=projectname, project=user)
251 db.session.add(projectnamedata)
252 db.session.commit
253 return projectnamedata
254
255
256
257projectsList = {
258 'projectName': fields.String,
259 'id':fields.Integer
260}
261
262class ViewProjects(Resource):
263 @marshal_with(projectsList)
264 def get(self,token):
265 #id = User.query.get(id)
266 user = User.query.filter_by(token=token).first()
267 userID = str(user.id)
268 if not user:
269 abort(400)
270 projects = user.projects.all()
271 return projects
272
273
274eachProjects = {
275 'projectName': fields.String,
276 'userID': fields.Integer,
277 'id': fields.Integer,
278}
279
280class ViewProjectID(Resource):
281 @marshal_with(eachProjects)
282 def get(self, auth_token,project_id):
283 user = User.query.filter_by(token=auth_token).first()
284 getProjects = user.projects.filter_by(id=project_id).first()
285 return getProjects
286
287
288viewsList = {
289 'viewsNickName': fields.String,
290 'projectID': fields.Integer, # Project ID - > ALL VIEWS Shown!
291 'id': fields.Integer
292}
293class ListofViews(Resource):
294 @marshal_with(viewsList)
295 def get(self,auth_token,project_id):
296 user = User.query.filter_by(token=auth_token).first()
297 getProjects = UserProjects.query.filter_by(id=project_id).first()
298 getViews = getProjects.projectAttr.all()
299 return getViews
300
301
302
303componentDict = {
304 'id':fields.Integer,
305 'viewID':fields.Integer,
306 'file_url':fields.String,
307 'filename':fields.String,
308 'permission':fields.String,
309 'filetype':fields.String,
310 'hidden':fields.Boolean,
311 'filesize':fields.Integer
312}
313eachViews = {
314 'view.filename': fields.String(default='shoes.json'),
315 'view.projectID':fields.Integer,
316 'view.id': fields.Integer,
317 'view.filesize':fields.String,
318 'components':fields.List(fields.Nested(componentDict))
319}
320class EachViews(Resource):
321 @marshal_with(eachViews)
322 def get(self, auth_token, project_id, view_id):
323 user = User.query.filter_by(token=auth_token).first()
324 getProjects = UserProjects.query.filter_by(id=project_id).first()
325 getViews = getProjects.projectAttr.filter_by(id=view_id).first()
326 view = Views.query.get(view_id)
327 component = view.component.all()
328 outputDict = {
329 'components':component,
330 'view':getViews
331 }
332 return outputDict
333### -> user/userID/projects/views/view_id/containers
334
335
336containers = {
337 'id': fields.Integer,
338 'viewID': fields.Integer
339}
340class Containers(Resource):
341 @marshal_with(containers)
342 def get(self, auth_token, project_id, view_id):
343 user = User.query.filter_by(token=auth_token).first()
344 getProjects = UserProjects.query.filter_by(id=project_id).first()
345 getViews = getProjects.projectAttr.filter_by(id=view_id).first()
346 containers = getViews.containers.all()
347 return containers
348
349cards = {
350 'id': fields.Integer,
351 'viewID': fields.Integer
352}
353class Cards(Resource):
354 @marshal_with(cards)
355 def get(self, auth_token, project_id, view_id):
356 user = User.query.filter_by(token=auth_token).first()
357 getProjects = UserProjects.query.filter_by(id=project_id).first()
358 getViews = getProjects.projectAttr.filter_by(id=view_id).first()
359 cards = getViews.containers.all()
360 return cards
361
362class AddProjectViews(Resource):
363 @marshal_with(ViewsAttrs)
364 def post(self):
365 ## Adds extra attributes to each views for instance project nickname etc.
366 ## This adds a new view to specified project_id
367 ## Parameters for this requests are:
368 ### -- Nickname
369 ### -- Token
370 ### -- project ID You want to create a VIEW FOR.
371 token = request.get_json(force=True)
372 tokenData = token['token']
373 viewID = request.get_json(force=True)
374 viewidData = viewID['project_id']
375 getViewID = UserProjects.query.filter_by(id=viewidData).first()
376 user = User.query.filter_by(token=tokenData).first()
377 if not user:
378 abort(400)
379 projectNickName = request.get_json(force=True)
380 projectNickNameData = projectNickName['nickname']
381 #AddViewsDynamic = User.views.query.filter_by('21')
382 #getViewsTotalSum = Views.component.query.all()
383 #for sizes in getViewsTotalSum:
384 # sizes = sizes.filesize
385 addViews = Views(projectID=getViewID.id)
386 db.session.add(addViews)
387 db.session.commit()
388 # user = User.query.get(2)
389 # view = Views.query.get('21')
390 # user.views.append(view)
391 # db.session.commit()
392 # addProjectAttr = Views(viewsNickName=projectNickNameData,views=getViewID)
393 # db.session.add(addProjectAttr)
394 # db.session.commit()
395 # return addProjectAttr
396
397
398addedContainer = {
399 'id': fields.Integer,
400 'viewID': fields.Integer
401}
402
403class AddContainer(Resource):
404 @marshal_with(addedContainer)
405 def post(self):
406 token = request.get_json(force=True)
407 tokenData = token['token']
408 projectID = request.get_json(force=True)
409 projectIDData = projectID['project_id']
410 viewID = request.get_json(force=True)
411 viewIDData = viewID['view_id']
412 queryViews = Views.query.filter_by(id=viewIDData).first()
413 user = User.query.filter_by(token=tokenData).first()
414 if not user:
415 abort(400)
416 addContainerDb = ContainersDB(containers=queryViews)
417 db.session.add(addContainerDb)
418 db.session.commit()
419 return addContainerDb
420
421
422addedCards = {
423 'id':fields.Integer,
424 'viewID': fields.Integer
425}
426
427class AddCards(Resource):
428 @marshal_with(addedCards)
429 def post(self):
430 token = request.get_json(force=True)
431 tokenData = token['token']
432 projectID = request.get_json(force=True)
433 projectIDData = projectID['project_id']
434 viewID = request.get_json(force=True)
435 viewIDData = viewID['view_id']
436 queryViews = Views.query.filter_by(id=viewIDData).first()
437 user = User.query.filter_by(token=tokenData).first()
438 if not user:
439 abort(400)
440 addContainerDb = CardsDB(cards=queryViews)
441 db.session.add(addContainerDb)
442 db.session.commit()
443 return addContainerDb
444
445containerDict = {
446 'viewID':fields.String(attribute='viewID'),
447 'id':fields.String(attribute='id')
448}
449
450cardsDict = {
451 'viewID':fields.String(attribute='viewID',default='None'),
452 'id':fields.String(attribute='id', default='None')
453}
454
455
456cards_marshaller = {
457 'viewsNickName': fields.String,
458 'containers':fields.List(fields.Nested(containerDict)),
459 'cards':fields.List(fields.String)
460 }
461
462
463
464tableExists = db.engine.dialect.has_table(db.engine, "Cards")
465if tableExists == True:
466 cards_marshaller = {
467 'viewsNickName': fields.String,
468 'containers':fields.List(fields.Nested(containerDict)),
469 'cards':fields.List(fields.Nested(cardsDict))
470 }
471else:
472 cards_marshaller = {
473 'viewsNickName': fields.String,
474 'containers':fields.List(fields.Nested(containerDict)),
475 }
476
477
478parameter_marshaller = {
479 'projectID':fields.String(attribute='projectID'),
480 'views':fields.List(fields.Nested(cards_marshaller)),
481 'projectName':fields.String(attribute='projectName')
482}
483
484set_marshaller = {
485 'user.email':fields.String,
486 'user.id':fields.Integer,
487 'projects':fields.Nested(parameter_marshaller)
488}
489
490
491class UserObjects(Resource):
492 @marshal_with(set_marshaller)
493 def get(self, token):
494 allCards = []
495 user = User.query.filter_by(token=token).first() ## all the users
496 projects = user.projects.all()
497
498 for eachView in projects:
499 id = eachView.id
500 dictionary = {}
501 dictionary['projectID'] = id
502 dictionary['projectName'] = eachView.projectName
503 views = eachView.projectAttr.filter_by(projectID=id).all()
504 dictionary['views'] = views
505 allCards.append(dictionary)
506
507 dictionary = {
508 'user':user,
509 'projects': allCards
510 }
511 return dictionary
512
513
514class CreateTable(Resource):
515 def get(self):
516 try:
517 print "TEST"
518 CardsDB.__table__.create(db.engine)
519 cardsVal =+ 1
520 query = DatabaseTables.query.first()
521 db.session.commit()
522 return jsonify({'Msg':'Created!'})
523 except exc.SQLAlchemyError:
524 return jsonify({'Error':'Couldnt create the table as it exists! :('})
525
526
527class DeleteTable(Resource):
528 def get(self):
529 try:
530 versions.__table__.drop(db.engine)
531 db.session.commit()
532 return jsonify({'Msg':'Deleted!'})
533 except exc.SQLAlchemyError:
534 return jsonify({'Error':'Couldnt delete the table :('})
535
536
537
538BucketObj = {
539 'filename':fields.String,
540 'file_url':fields.String
541}
542
543##Componenets are bucket files in this case.
544class GetAllBucketFiles(Resource):
545 @marshal_with(BucketObj)
546 def get(self,token,bucket):
547 user = User.query.filter_by(token=token).first()
548 if not user:
549 abort(400)
550 buckets = s3.Bucket(str(bucket))
551 allObj = buckets.objects.all()
552 arr = []
553 for items in allObj:
554 dictionary = {}
555 dictionary['filename'] = items.key
556 dictionary['file_url'] = 'https://ben-uguru.s3.amazonaws.com/'+str(items.key)
557 arr.append(dictionary)
558 return arr
559
560
561class SetFilePerms(Resource):
562 def put(self):
563 try:
564 jsonData = request.get_json(force=True)
565 token = jsonData['token']
566 fileperm = jsonData['permission']
567 filename = jsonData['filename']
568 user = User.query.filter_by(token=token).first
569 if not user:
570 abort(400)
571 object = s3.Bucket('ben-uguru').Object(filename)
572 object.Acl().put(ACL=fileperm)
573 return jsonify({'Msg':'Updated file perm to'+ ' '+fileperm+ ' for file'+ ' '+ filename})
574 except:
575 abort(400)
576
577
578component_marshaller = {
579 'id': fields.Integer,
580 'viewID': fields.Integer
581}
582
583class Component(Resource):
584 @marshal_with(component_marshaller)
585 def put(self):
586 jsonData = request.get_json(force=True)
587 token = jsonData['token']
588 project_id = jsonData['project_id']
589 viewIDData = jsonData['view_id']
590 user = User.query.filter_by(token=token).first()
591 getProjects = UserProjects.query.filter_by(id=project_id).first()
592 getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
593 queryViews = Views.query.filter_by(id=viewIDData).first()
594 addContainerDb = component(comp=queryViews)
595 db.session.add(addContainerDb)
596 db.session.commit()
597 return addContainerDb
598
599 def delete(self):
600 jsonData = request.get_json(force=True)
601 token = jsonData['token']
602 project_id = jsonData['project_id']
603 viewIDData = jsonData['view_id']
604 comp_id = jsonData['comp_id']
605 user = User.query.filter_by(token=token).first()
606 getProjects = UserProjects.query.filter_by(id=project_id).first()
607 getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
608 queryViews = Views.query.filter_by(id=viewIDData).first()
609 compQuery = component.query.filter_by(id=comp_id).first()
610 db.session.delete(compQuery)
611 db.session.commit()
612 return jsonify({'Msg':'Deleted!'})
613 if not comp_id:
614 abort(400)
615
616
617
618
619
620
621popularreleases = {
622 'shoe_name':fields.String,
623 'release_date':fields.String
624}
625class Shoes(Resource):
626 @marshal_with(popularreleases)
627 def get(self):
628 response = requests.get('http://sneakernews.com/release-dates/',headers=headers).text
629 soup = BeautifulSoup(response)
630 popularReleases = soup.find('div',attrs={'class':'popular-releases-block'}).findAll('li')
631 arr = []
632 for eachShoes in popularReleases:
633 dictionary={}
634 dictionary['shoe_name'] = eachShoes.find('a').text
635 dictionary['release_date'] = eachShoes.find('em').text
636 arr.append(dictionary)
637 return arr
638
639
640
641
642api.add_resource(Shoes,'/api/release')
643#api.add_resource(Shoes,'/api/releases/<date>')
644
645class removeComponentFromViews(Resource):
646 def post(self):
647 jsonData = request.get_json(force=True)
648 token = jsonData['token']
649 project_id = jsonData['project_id']
650 viewIDData = jsonData['view_id']
651 comp_id = jsonData['comp_id']
652 user = User.query.filter_by(token=token).first()
653 getProjects = UserProjects.query.filter_by(id=project_id).first()
654 getViews = getProjects.projectAttr.filter_by(id=viewIDData).first()
655 queryViews = Views.query.filter_by(id=viewIDData).first()
656 compQuery = component.query.filter_by(id=comp_id).first()
657 compQuery.hidden = True
658 db.session.commit()
659 return jsonify({'Message':'Component Hidden!'})
660
661versionsz = {
662 'versions.version_url':fields.String
663}
664
665viewMarshaller = {
666 'viewID':fields.Integer,
667 'id':fields.Integer,
668 'filename':fields.String,
669 'permission':fields.String,
670 'file_url':fields.String,
671 'filetype':fields.String,
672 'component.versions':fields.String,
673}
674listComp = {
675 # 'viewID':fields.Integer,
676 # 'id':fields.Integer,
677 # 'filename':fields.String,
678 # 'permission':fields.String,
679 # 'file_url':fields.String,
680 # 'filetype':fields.String,
681 'views':fields.Nested(viewMarshaller),
682 #'versions':fields.Nested(versionsz)
683}
684
685
686class getComponent(Resource):
687 @marshal_with(listComp)
688 def get(self, token, project_id, view_id):
689 fullArr = []
690 user = User.query.filter_by(token=token).first()
691 getProjects = UserProjects.query.filter_by(id=project_id).first()
692 getViews = getProjects.projectAttr.filter_by(id=view_id).first()
693 getComponent = getViews.component.filter_by(hidden=0).all()
694 for component in getComponent:
695 dictionary = {}
696 versions = component.versions.all()
697 dictionary['versions'] = versions
698 fullArr.append(dictionary)
699
700 dictionary = {
701 'views':getComponent,
702 'versions':fullArr
703 }
704 return dictionary
705
706api.add_resource(SetFilePerms, '/user/updateperm')
707api.add_resource(GetAllBucketFiles,'/user/<token>/<bucket>/files')
708api.add_resource(UploadMultipleFiles,'/user/upload')
709api.add_resource(CreateTable,'/user/create/table')
710api.add_resource(DeleteTable,'/user/delete/table')
711api.add_resource(UserObjects,'/user/<token>')
712api.add_resource(Containers,'/user/<auth_token>/projects/<project_id>/<view_id>/containers')
713api.add_resource(Cards,'/user/<auth_token>/projects/<project_id>/<view_id>/cards')
714api.add_resource(getComponent,'/user/<token>/projects/<project_id>/<view_id>/component')
715api.add_resource(EachViews, '/user/<auth_token>/projects/<project_id>/<view_id>')
716api.add_resource(ListofViews, '/user/<auth_token>/projects/<project_id>/views')
717api.add_resource(ViewProjectID, '/user/<auth_token>/projects/<project_id>')
718api.add_resource(ViewProjects,'/user/<token>/projects')
719
720## ----> user -> projects -> views - > views has many cards and containers
721
722#### ------ Below are extra routes to add stuff in the databaase ------ ####
723api.add_resource(removeComponentFromViews,'/user/updatecomponent')
724api.add_resource(Component, '/api/users/component')
725api.add_resource(AddCards, '/api/users/cards')
726api.add_resource(AddContainer,'/api/users/ac')
727api.add_resource(AddProjectViews,'/api/users/views') ## ---> Adds a new views to a project.
728api.add_resource(CreateProject,'/api/users/createproject') ## --> Creates a new project in the database
729api.add_resource(APIUser, '/api/token') ## --> Needs authentication then gives user a set of token
730api.add_resource(RegisterUser,'/api/register') ## -> Creates a new user in the database
731
732if __name__ == "__main__":
733 app.run()