Skip to content

Commit

Permalink
commentate api rest
Browse files Browse the repository at this point in the history
  • Loading branch information
matteomarchiori committed May 13, 2019
1 parent f23d4a6 commit 2222758
Showing 1 changed file with 69 additions and 8 deletions.
77 changes: 69 additions & 8 deletions Butterfly/gestore_personale/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,33 @@


class SubjectResource(type(Subject), type(flask_restful.Resource)):
"""
Metaclasse per rendere Subject una Resource
"""
pass


class Resource(Subject, flask_restful.Resource, metaclass=SubjectResource):
"""
Classe per definire una risorsa.
"""

def __init__(self, model: MongoFacade):
super(Resource, self).__init__()
self._model = model

def notify(self, request_type: str, resource: str, url: str, msg: str):
"""
Metodo per notificare gli osservatori della risorsa
"""
for obs in self._lst:
return obs.update(request_type, resource, url, msg)


class User(Resource):
"""
Classe per rappresentare la risorsa User
"""

def get(self, url: str):
return self.notify('user', 'GET', url, None)
Expand All @@ -65,13 +77,19 @@ def delete(self, url: str):


class PostUser(Resource):
"""
Classe per rappresentare la risorsa User senza parametro
"""

def post(self):
data = request.get_json(force=True)
return self.notify('user', 'POST', None, data)


class Project(Resource):
"""
Classe per rappresentare la risorsa Project
"""

def get(self, url: str):
return self.notify('project', 'GET', url, None)
Expand All @@ -81,6 +99,9 @@ def delete(self, url: str):


class Preference(Resource):
"""
Classe per rappresentare la risorsa Preference
"""

def put(self, url: str) -> dict:
data = request.get_json(force=True)
Expand All @@ -90,14 +111,21 @@ def delete(self, url: str) -> dict:
data = request.get_json(force=True)
return self.notify('preference', 'DELETE', url, data)


class PostPreference(Resource):
"""
Classe per rappresentare la risorsa Preference senza parametro
"""

def post(self):
data = request.get_json(force=True)
return self.notify('preference', 'POST', None, data)


class ApiHandler:
"""
Classe per gestire le richieste alle Api REST
"""

def __init__(
self,
Expand All @@ -106,11 +134,17 @@ def __init__(
self._model = model

def api_user(self, request_type: str, url: str, msg: str):
"""
Metodo per gestire le richieste alla risorsa User
"""

if request_type == 'GET':
# leggo dal database, se non lo trovo l'utente non esiste
try:
user = self._model.read_user(url)
userjson = json.loads(dumps(user))
if userjson.get('irreperibilita'):
# rendo leggibile l'irreperibilita
for i, data in enumerate(userjson['irreperibilita']):
userjson['irreperibilita'][i]['$date'] = datetime.datetime.strftime(
datetime.datetime.fromtimestamp(
Expand All @@ -122,15 +156,18 @@ def api_user(self, request_type: str, url: str, msg: str):
except AssertionError:
return {'error': 'Utente inesistente.'}, 404
elif request_type == 'PUT':
# leggo i campi della richiesta per le modifiche
nome = msg.get('name')
cognome = msg.get('surname')
email = msg.get('email')
telegram = msg.get('telegram')
modify = {}
# memorizzo i vecchi identificativi
oldmail = self._model.get_user_email_web(url)
oldtelegram = self._model.get_user_telegram_web(url)
userid = oldmail if oldmail else oldtelegram
if email or telegram:
# aggiungo i campi da modificare
if nome:
modify.update(nome=nome)
if cognome:
Expand All @@ -139,6 +176,7 @@ def api_user(self, request_type: str, url: str, msg: str):
modify.update(email=email)
if telegram:
modify.update(telegram=telegram)
# controllo che i dati univoci non confliggano
if ((
email and
self._model.user_exists(email) and
Expand All @@ -151,6 +189,7 @@ def api_user(self, request_type: str, url: str, msg: str):
):
return {'error': 'I dati inseriti confliggono\
con altri già esistenti.'}, 409
# aggiorno i dati
if('nome' in modify):
self._model.update_user_name(
userid,
Expand All @@ -163,9 +202,9 @@ def api_user(self, request_type: str, url: str, msg: str):
)
if(
'email' in modify and (
(not oldmail) or
(modify['email'] != oldmail)
)):
not oldmail or
modify['email'] != oldmail)
):
self._model.update_user_email(
userid,
modify.get('email')
Expand All @@ -180,6 +219,7 @@ def api_user(self, request_type: str, url: str, msg: str):
modify.get('telegram')
)
userid = modify['telegram']
# controllo il caso identificativi da scambiare
if('email' not in modify):
self._model.update_user_email(
userid,
Expand Down Expand Up @@ -211,11 +251,13 @@ def api_user(self, request_type: str, url: str, msg: str):
self._model.delete_user(url)
return {'ok': 'Utente rimosso correttamente'}, 200
elif request_type == 'POST':
# leggo i campi della richiesta per l'aggiunta utente
nome = msg.get('name')
cognome = msg.get('surname')
email = msg.get('email')
telegram = msg.get('telegram')
if email or telegram:
# controllo non ci siano conflitti con gli identificativi
if (
(email and self._model.user_exists(email)) or
(telegram and self._model.user_exists(telegram))
Expand All @@ -228,6 +270,7 @@ def api_user(self, request_type: str, url: str, msg: str):
email=email,
telegram=telegram
)
# imposto una preferenza di default
if email:
self._model.update_user_preference(email, 'email')
elif telegram:
Expand All @@ -240,9 +283,9 @@ def api_user(self, request_type: str, url: str, msg: str):
return {'error': 'Si prega di inserire almeno email o telegram\
per inserire l\'utente.'}, 409


def api_project(self, request_type: str, url: str, msg: str):
if request_type == 'GET':
# se il progetto non esiste, restituisco l'errore
try:
project = self._model.read_project(url)
projectjson = json.loads(dumps(project))
Expand All @@ -251,25 +294,30 @@ def api_project(self, request_type: str, url: str, msg: str):
return {'error': 'Progetto inesistente.'}, 404
elif request_type == 'DELETE':
if url:
# elimino tutte le preferenze legate al progetto
users = self._model.get_project_users(url)
for user in users:
if user.get('email'):
userid = user['email']
elif user.get('telegram'):
userid = user['telegram']
self._model.remove_user_project(userid, url)
# elimino il progetto
self._model.delete_project(url)
return {'ok': 'Progetto rimosso correttamente'}, 200

def api_preference(self, request_type: str, url: str, msg: str):
if request_type == 'PUT':
# controllo il tipo di preferenza da modificare
tipo = msg.get('tipo')
if tipo == 'topics':
# leggo i campi da modificare
project = msg.get('project')
priority = msg.get('priority')
topics = msg.get('topics')
keywords = msg.get('keywords')
user_projects = self._model.get_user_projects(url)
# controllo che l'utente sia interessato
if(
user_projects and
any(voice['url'] == project for voice in user_projects)
Expand All @@ -282,6 +330,7 @@ def api_preference(self, request_type: str, url: str, msg: str):
url,
project
)
# imposto i topics
for topic in topics:
if (
project_data and
Expand All @@ -293,6 +342,7 @@ def api_preference(self, request_type: str, url: str, msg: str):
project,
topic
)
# imposto le keywords
self._model.reset_user_keywords(
url,
project
Expand All @@ -308,9 +358,12 @@ def api_preference(self, request_type: str, url: str, msg: str):
return {'error': 'Progetto non presente nelle\
preferenze.'}, 404
elif tipo == 'irreperibilita':
# controllo il formato delle date
try:
# ricevo le date
giorni = msg.get('giorni')
if giorni:
# metto in liste giorni vecchi e giorni nuovi
giorni_old = self._model.read_user(
url
).get('irreperibilita')
Expand All @@ -319,7 +372,9 @@ def api_preference(self, request_type: str, url: str, msg: str):
giorni_new.append(
datetime.datetime.strptime(giorno, '%Y-%m-%d')
)
to_remove=[]
to_remove = []
# se il giorno vecchio non è tra i nuovi, va rimosso
# ma va fatto per mese, non in assoluto
if giorni_old and giorni_new:
for giorno in giorni_new:
to_remove.append(
Expand All @@ -343,14 +398,16 @@ def api_preference(self, request_type: str, url: str, msg: str):
int(month),
int(giorno.strftime('%d'))
)
# aggiungo le nuove irreperibilità
for giorno in giorni_new:
self._model.add_giorno_irreperibilita(
url,
int(giorno.strftime('%Y')),
int(giorno.strftime('%m')),
int(giorno.strftime('%d'))
)
return {'ok': 'Preferenza modificata correttamente'}, 200
return {'ok': 'Preferenza modificata\
correttamente'}, 200
return {'error': 'Giorni non inseriti.'}, 404
except ValueError:
return {'error': 'Le date fornite non sono in formato\
Expand All @@ -360,11 +417,13 @@ def api_preference(self, request_type: str, url: str, msg: str):
if platform == "telegram":
telegram = self._model.get_user_telegram_web(url)
if not telegram:
return {'error': 'Telegram non presente nel sistema.'}, 404
return {'error': 'Telegram non presente nel\
sistema.'}, 404
elif platform == "email":
email = self._model.get_user_email_web(url)
if not email:
return {'error': 'Email non presente nel sistema.'}, 404
return {'error': 'Email non presente nel\
sistema.'}, 404
else:
return {'error': 'La piattaforma deve essere telegram\
o email.'}, 400
Expand All @@ -374,6 +433,7 @@ def api_preference(self, request_type: str, url: str, msg: str):
return {'error': 'Tipo di preferenza non trovato.'}, 400
elif request_type == 'DELETE':
project = msg.get('project')
# controllo che il progetto esista e sia nelle preferenze
try:
if project and self._model.get_project_by_url(project):
self._model.remove_user_project(url, project)
Expand All @@ -387,6 +447,7 @@ def api_preference(self, request_type: str, url: str, msg: str):
elif request_type == 'POST':
user = msg.get('user')
project = msg.get('project')
# controllo che il progetto non esista e che l'utente esista
try:
if project and self._model.get_project_by_url(project):
self._model.add_user_project(user, project)
Expand Down

0 comments on commit 2222758

Please sign in to comment.